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)
array_filter
devrait fonctionner correctement si vous utilisez l'opérateur de comparaison identical
.
$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');
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');
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");
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"));
?>
Les one-liners sont toujours gentils.
$clean_array = array_diff(array_map('trim', $my_array), array('', NULL, FALSE));
Explication:
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.array_diff
: Un tableau d'éléments que vous souhaitez supprimer de $my_array
.''
, 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(''));
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);
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
)