Page 1 sur 1

Supprimer les chaînes vides d'un tableau

Posté : 14 mars 2008, 15:35
par mere-teresa
Je cherche un moyen de supprimer d'un tableau à 2 dimensions les valeurs qui sont des chaînes vides.

Voici à quoi ressemble mon tableau :
 $_POST = array(
         array(
           'nom'=>'MEUNIER',
           'prenom' => 'jacques',
           'email' => '[email protected]'
         ),
         array(
           'nom'=>'Einstein',
           'prenom' => 'Albert',
           'email' => '[email protected]'
         ),
         array(
           'nom'=>'',
           'prenom' => '',
           'email' => ''
         )
         );

Posté : 14 mars 2008, 15:48
par Cyrano
Une petite fonction récursive peut-être ? Écrit très vite fait, ça prendra le nombre de dimensions qu'ilo y aura dans le tableau, de 1 à n dimensions :
<?php
$aDonnees = array(
    array(
        'nom'=>'MEUNIER',
        'prenom' => 'jacques',
        'email' => '[email protected]'
    ),
    array(
        'nom'=>'Einstein',
        'prenom' => 'Albert',
        'email' => '[email protected]'
    ),
    array(
        'nom'=>'',
        'prenom' => '',
        'email' => ''
    )
);

function nettoyerTableau($aTableau)
{
    $aNewTab = array();
    $e = 0;
    foreach($aTableau as $index => $valeur)
    {
        if(is_array($valeur))
        {
            $valeur = nettoyerTableau($valeur);
        }
        if(!empty($valeur))
        {
            $aNewTab[$index] = $valeur;
        }
    }
    return $aNewTab;
}

echo('<pre style="text-align: left; font-size: 11px">tableau d\'Origine' . "\n");
print_r($aDonnees);
echo("</pre>\n");
$aD2 = nettoyerTableau($aDonnees);
echo('<pre style="text-align: left; font-size: 11px">tableau nettoyé' . "\n");
print_r($aD2);
echo("</pre>\n");
Résultat obtenu :

Code : Tout sélectionner

tableau d'Origine Array ( [0] => Array ( [nom] => MEUNIER [prenom] => jacques [email] => [email protected] ) [1] => Array ( [nom] => Einstein [prenom] => Albert [email] => [email protected] ) [2] => Array ( [nom] => [prenom] => [email] => ) ) tableau nettoyé Array ( [0] => Array ( [nom] => MEUNIER [prenom] => jacques [email] => [email protected] ) [1] => Array ( [nom] => Einstein [prenom] => Albert [email] => [email protected] ) )
:-k

Posté : 14 mars 2008, 15:48
par Hywan
Tu veux supprimer si et seulement tout le sous-tableau est vide ?

PS : Totalement grillé, j'avais déjà préparé le script en plus lol :lol:.

Posté : 14 mars 2008, 15:50
par mere-teresa
Merci Cyrano mais je cherchais, si possible avec les fonctions natives :) comme filter_input, array_filter, etc.

HyWaN : oui, il s'agit d'insérer plusieurs personnes depuis un seul formulaire, si j'insère 3 personnes, la suite du formulaire est quand même passée.

Posté : 14 mars 2008, 15:52
par Cyrano
Merci Cyrano mais je cherchais, si possible avec les fonctions natives :) comme filter_input, array_filter, etc.
Je me disais bien aussi qu'il y avait un truc pour que tu poses des questions ici toi :P

Mais là, je cale, je doute à priori que ça existe, une chaine vide étant une valeur contrairement à NULL. :-k

Posté : 14 mars 2008, 15:56
par Hywan
Bien, alors voici ce que je propose avec array_filter :
<?php

header('Content-type: text/plain');

$_POST = array( 
         array( 
           'nom'=>'MEUNIER', 
           'prenom' => 'jacques', 
           'email' => '[email protected]' 
         ), 
         array( 
           'nom'=>'Einstein', 
           'prenom' => 'Albert', 
           'email' => '[email protected]' 
         ), 
         array( 
           'nom'=>'', 
           'prenom' => '', 
           'email' => '' 
         ) 
         ); 

function nettoyerVide ( $var ) {

    if(!is_array($var))
        return true;

    // On fait l'hypothèse que le tableau est plein.
    $empty = false;
    foreach($var as $key => $value)
        $empty |= !empty($value);

    return $empty;
}

print_r(array_filter($_POST, 'nettoyerVide'));

Posté : 14 mars 2008, 15:57
par Aureusms
Merci Cyrano mais je cherchais, si possible avec les fonctions natives :) comme filter_input, array_filter, etc.

HyWaN : oui, il s'agit d'insérer plusieurs personnes depuis un seul formulaire, si j'insère 3 personnes, la suite du formulaire est quand même passée.
Pourquoi tu ne fais pas la ségrégation lors de l'insertion ?

Posté : 14 mars 2008, 17:04
par mere-teresa
Merci Cyrano mais je cherchais, si possible avec les fonctions natives :) comme filter_input, array_filter, etc.

HyWaN : oui, il s'agit d'insérer plusieurs personnes depuis un seul formulaire, si j'insère 3 personnes, la suite du formulaire est quand même passée.
Pourquoi tu ne fais pas la ségrégation lors de l'insertion ?
Je n'ai pas compris ta proposition...

Posté : 14 mars 2008, 17:53
par Cyrano
n'enregistrer que si rien n'est vide dans une série ? :-k

Posté : 14 mars 2008, 18:23
par AB
Si on ne veut absolument pas faire de boucle on peut bricoler quelque chose comme ça :
function filtre($tab) {
$tab = array_filter($tab);
return $tab;
}
$tab = array_filter(array_map('filtre',$tab));

Posté : 14 mars 2008, 19:08
par Hubert Roksor
Je crois que tu voulais le faire dans l'autre sens : array_map('array_filter', $arr). [Màj : ah ben non, je n'avais pas lu ce que faisait ta fonction, en fait on fait la même chose] Par exemple
$arr = array_filter(array_map('array_filter', $arr));
Ça retirera les entrées champs vides, puis les groupes vides.

:!: Effets secondaires
  • ça retire les champs dont le contenu est "0" (mais pas "00" autant que je me souvienne)
  • ça veut dire que certains groupes n'auront peut-être que 1 ou 2 champs remplis, toujours utiliser isset()
PS : est-ce que quelqu'un pourrait sortir une version utilisant l'extension Filter ?