web-dev-qa-db-fra.com

Supprimer NULL, FALSE et '' - mais pas - d'un PHP tableau

Je veux supprimer les valeurs NULL, FALSE et ''.

J'ai utilisé array_filter mais cela supprime également le 0.

Y a-t-il une fonction pour faire ce que je veux?

array(NULL,FALSE,'',0,1) -> array(0,1)
25

array_filter devrait fonctionner correctement si vous utilisez l'opérateur de comparaison identical .

voici un exemple

$values = [NULL, FALSE, '', 0, 1];

function myFilter($var){
  return ($var !== NULL && $var !== FALSE && $var !== '');
}

$res = array_filter($values, 'myFilter');

Ou si vous ne souhaitez pas définir de fonction de filtrage, vous pouvez également utiliser une fonction fonction anonyme (fermeture):

$res = array_filter($values, function($value) {
    return ($value !== null && $value !== false && $value !== ''); 
});

Si vous avez seulement besoin des valeurs numériques, vous pouvez utiliser is_numeric comme rappel: exemple

$res = array_filter($values, 'is_numeric');
38
Max Girkens

De http://php.net/manual/en/function.array-filter.php#111091 :

Si vous souhaitez supprimer les chaînes NULL, FALSE et Empty, mais laissez les valeurs 0, vous pouvez utiliser strlen comme fonction de rappel:

array_filter($array, 'strlen');
29
Vladyslav Savchenko

array_filter ne fonctionne pas car, par défaut, il supprime tout ce qui est équivalent à FALSE et PHP considère que 0 est équivalent à false. Le manuel PHP a ceci à dire sur le sujet:

Lors de la conversion en booléen, les valeurs suivantes sont considérées comme FALSE:

  • le booléen FAUX lui-même
  • le nombre entier 0 (zéro)
  • le flottant 0.0 (zéro)
  • la chaîne vide et la chaîne "0"
  • un tableau avec zéro élément
  • un objet avec zéro variable membre (PHP 4 uniquement)
  • le type spécial NULL (y compris les variables non définies)
  • Objets SimpleXML créés à partir de balises vides

Toute autre valeur est considérée comme VRAIE (y compris toute ressource). 

Vous pouvez passer un deuxième paramètre à array_filter avec un rappel à une fonction que vous écrivez vous-même, qui indique à array_filter s'il faut ou non supprimer l'élément.

En supposant que vous vouliez supprimer toutes les valeurs équivalentes à FALSE sauf zéros, cette fonction est facile à écrire:

function RemoveFalseButNotZero($value) {
  return ($value || is_numeric($value));
}

Ensuite, vous écrasez simplement le tableau d'origine avec le tableau filtré:

$array = array_filter($array, "RemoveFalseButNotZero");
5
AgentConundrum

Utilisez une fonction de rappel personnalisée avec array_filter. Voir cet exemple, extrait du manuel PHP, sur l'utilisation des fonctions de rappel. Dans cet exemple, la fonction de rappel filtre sur la base impair/pair; vous pouvez écrire une petite fonction à filtrer en fonction de vos besoins. 

<?php
function odd($var)
{
    // returns whether the input integer is odd
    return($var & 1);
}

function even($var)
{
    // returns whether the input integer is even
    return(!($var & 1));
}

$array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$array2 = array(6, 7, 8, 9, 10, 11, 12);

echo "Odd :\n";
print_r(array_filter($array1, "odd"));
echo "Even:\n";
print_r(array_filter($array2, "even"));
?> 
2
Amit

Les one-liners sont toujours gentils.

$clean_array = array_diff(array_map('trim', $my_array), array('', NULL, FALSE));

Explication:  

  • 1er paramètre de array_diff: Version corrigée de $my_array. En utilisant array_map, les espaces blancs environnants sont supprimés de chaque élément via la fonction trim. Il est bon d’utiliser la version tronquée dans le cas où un élément contient une chaîne qui n’est autre que des espaces (par exemple, des tabulations, des espaces), que je suppose également que vous souhaitez également supprimer. Vous pouvez tout aussi facilement utiliser $ my_array pour le 1er paramètre si vous ne voulez pas couper les éléments.
  • 2nd paramètre of array_diff: Un tableau d'éléments que vous souhaitez supprimer de $my_array.
  • Sortie: Un tableau d'éléments contenus dans le premier tableau et non contenus dans le deuxième tableau. Dans ce cas, étant donné que '', NULL et FALSE sont dans le second tableau, ils ne peuvent jamais être retournés par array_diff.

MODIFIER:

Il s'avère que vous n'avez pas besoin d'avoir NULL et FALSE dans le second tableau. Au lieu de cela, vous pouvez simplement avoir '', et cela fonctionnera de la même manière:

$clean_array = array_diff(array_map('trim', $my_array), array(''));
1
seane

vérifiez si elle est inférieure à 1 et supérieure à -1 si vous ne l'enlevez pas ...

$arrayValue = (NULL,FALSE,'',0,1);
$newArray = array();
foreach($arrayValue as $value) {
    if(is_int($value) || ($value>-1 && $value <1)) {
        $newArray[] = $value;
    }
}

print_r($newArray);
0
Vinoth Babu
function my_filter($var)
{
    // returns values that are neither false nor null (but can be 0)
    return ($var !== false && $var !== null && $var !== '');
}

$entry = array(
             0 => 'foo',
             1 => false,
             2 => -1,
             3 => null,
             4 => '',
             5 => 0
          );

print_r(array_filter($entry, 'my_filter'));

Les sorties:

Array
(
    [0] => foo
    [2] => -1
    [5] => 0
)
0
Voitek Zylinski