Supprimer les chaînes vides d'un tableau

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

14 mars 2008, 15:35

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' => ''
         )
         );
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Mammouth du PHP | 19672 Messages

14 mars 2008, 15:48

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
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 4674 Messages

14 mars 2008, 15:48

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:.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

14 mars 2008, 15:50

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.
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Mammouth du PHP | 19672 Messages

14 mars 2008, 15:52

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
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 4674 Messages

14 mars 2008, 15:56

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'));
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 1996 Messages

14 mars 2008, 15:57

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 ?
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

14 mars 2008, 17:04

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...
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Mammouth du PHP | 19672 Messages

14 mars 2008, 17:53

n'enregistrer que si rien n'est vide dans une série ? :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
AB
ViPHP | 5818 Messages

14 mars 2008, 18:23

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));

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

14 mars 2008, 19:08

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 ?