Dans PHP, Array_Filter () est une fonction de tableau très courante qui est utilisée pour filtrer les éléments dans un tableau basé sur le résultat de la fonction de rappel. Son utilisation peut sembler simple, mais de nombreux développeurs sont perplexes par la «signification booléenne» de leur valeur de retour lors de l'utilisation, en particulier lors de la rédaction de fonctions de rappel.
Par exemple, quelqu'un a écrit le code suivant:
$input = [0, 1, 2, 3, 4, 5];
$result = array_filter($input, function($value) {
return $value % 2; // J'espère garder des nombres étranges
});
print_r($result);
Ils pourraient s'attendre à ce que la sortie soit [1, 3, 5] , tout comme le résultat. Cependant, si vous apportez une petite modification à cet exemple, cela provoquera facilement la confusion:
$input = [0, 1, 2, 3, 4, 5];
$result = array_filter($input, function($value) {
return $value % 2 == 0; // J'espère garder les nombres uniformes
});
print_r($result);
Beaucoup de gens pensent que si les éléments sont conservés à leur retour, et s'ils reviennent faux , ils sont filtrés. C'est en effet vrai. Mais la clé est que - PHP est un langage dynamiquement typé, et toute valeur renvoyée par la fonction de rappel sera jetée à une valeur booléenne.
Ces valeurs en PHP sont converties en fausse :
Valeur booléenne fausse
Entier 0
Type de point flottant 0.0
Chaîne vide '' ou '0'
Array vide []
nul
Ainsi, lorsque vous écrivez le code suivant:
$input = ['a', '', 'b', '0', 'c'];
$result = array_filter($input);
print_r($result);
Vous constaterez que la sortie est:
Array
(
[0] => a
[2] => b
[4] => c
)
Lorsqu'aucune fonction de rappel n'est spécifiée, Array_Filter () utilise un casting booléen par défaut pour déterminer si un élément est conservé. Ainsi, les deux chaînes vides '' et «0» sont filtrées - car elles sont converties en fausses .
Pour le moment, beaucoup de gens seront confus: "J'ai clairement de la valeur, pourquoi a-t-il été filtré?"
D'autres malentendus se produisent généralement lorsque les développeurs utilisent des rappels pour retourner les types non boooliens:
$input = [1, 2, 3, 4, 5, 6];
$result = array_filter($input, function($value) {
return $value & 1; // Utilisez les nombres impairs du bit et jugez
});
print_r($result);
Ce code est correct, mais il peut rendre les débutants fous. Le résultat de la valeur $ et 1 est 0 ou 1. Lorsque la valeur $ est un nombre pair, le résultat est 0 , qui sera converti en faux et est filtré. Pour le moment, vous devez comprendre que ce n'est pas que la valeur renvoyant 1 ou 0 elle-même détermine si les éléments sont conservés, mais les performances de ces valeurs dans un environnement booléen.
Une autre chose que beaucoup de gens n'ont pas remarqué: array_filter () conserve le nom de clé du tableau d'origine. Si vous souhaitez reconstruire l'index, vous pouvez utiliser array_values () :
$result = array_values(array_filter($input, function($value) {
return $value > 2;
}));
Par exemple, vous souhaitez filtrer les liens sans paramètres de jeton à partir d'un ensemble d'URL:
$urls = [
'https://m66.net/page1?token=abc',
'https://m66.net/page2',
'https://m66.net/page3?token=xyz',
];
$filtered = array_filter($urls, function($url) {
$parts = parse_url($url);
if (!isset($parts['query'])) {
return false;
}
parse_str($parts['query'], $query);
return isset($query['token']);
});
print_r($filtered);
La fonction de rappel de ce code renvoie explicitement une valeur booléenne ( true ou false ) afin qu'elle ne soit pas confuse par la conversion de type.
Beaucoup de gens ne comprennent pas la "signification booléenne" de la valeur de retour de la fonction de rappel Array_Filter () . En dernière analyse, ils n'ont pas une compréhension approfondie des "valeurs vraies et fausses" dans PHP. Pour écrire une fonction de rappel Array_Filter () fiable, n'oubliez pas:
La valeur de retour de la fonction de rappel est convertie en valeur booléenne.
Ne dépendez pas directement de savoir si un type (comme un nombre ou une chaîne) a une "valeur", mais renvoie explicitement True ou False .
Si votre intention est un jugement logique clair, écrivez explicitement l'expression booléenne.
De cette façon, vous pouvez maîtriser complètement cette fonction puissante et facilement mal compris!