Dans la programmation PHP quotidienne, Array_Diff () est une fonction très pratique qui peut être utilisée pour trouver la différence entre deux tableaux. Mais de nombreux développeurs peuvent rencontrer une situation étrange lors de l'utilisation de cette fonction:
Que se passe-t-il? Explorons les raisons ensemble.
Jetons un coup d'œil au code suivant:
$a = [true, false];
$b = [0];
$result = array_diff($a, $b);
print_r($result);
Vous pourriez penser intuitivement que vrai et faux ne sont pas dans le tableau $ b , donc $ le résultat devrait être [vrai, faux] , mais vous obtiendrez en fait la sortie suivante:
Array
(
[0] => 1
)
Êtes-vous un peu confus? Pourquoi le faux est-il filtré? Et vrai devient aussi un entier 1 ? Démoussons progressivement ce problème.
Premièrement, nous devons comprendre le comportement sous-jacent de Array_Diff () . Selon les instructions de la documentation officielle PHP :
Array_Diff () utilise "la comparaison non stricte" (==) pour vérifier si les valeurs sont égales.
C'est-à-dire, array_diff () n'utilise pas congruent == pour comparer les valeurs, mais utilise un signe double égal == .
Cela signifie que les valeurs suivantes seront considérées comme «égales»:
false == 0; // true
true == 1; // true
true == "1"; // true
false == ""; // true
Dans notre exemple, False est jugé égal par 0 et est donc exclu du résultat par array_diff () .
Un autre détail est que le tableau renvoyé par array_diff () est un tableau de valeurs numériques, et PHP convertira implicitement les valeurs booléennes dans certains cas. Par exemple:
var_dump(true); // Sortir bool(true)
echo true; // Sortir 1
Lors de la sortie dans print_r () , le Boolean True est converti en 1 . C'est pourquoi vous verrez 1 apparaître dans le résultat, pas vrai .
Si vous devez comparer les types de données (par exemple, vous devez vraiment faire la distinction entre True et 1 ), vous pouvez utiliser array_udiff () et coopérer avec une fonction de comparaison personnalisée:
$a = [true, false];
$b = [0];
$result = array_udiff($a, $b, function($x, $y) {
return ($x === $y) ? 0 : 1;
});
print_r($result);
Sortir:
Array
(
[0] => 1
[1] =>
)
Notez que False (la valeur correspondante est vide) est également conservée cette fois, car nous avons utilisé une comparaison congruente === .
Si vous devez distinguer ces valeurs plus clairement et préserver la représentation du type booléen, vous pouvez combiner var_export () pour produire le résultat:
var_export($result);
Bien que le comportement par défaut de Array_Diff () soit très efficace dans de nombreux scénarios, il est facile de produire des résultats déroutants lorsqu'ils traitent des tableaux de valeurs booléennes, de nombres et de chaînes. Il s'agit également d'un piège typique causé par un affaiblissement du type en PHP.
En développement, si vous avez des exigences strictes sur les types de données, évitez d'utiliser le par défaut Array_Diff () et utilisez plutôt Array_udiff () et fournissez votre propre fonction de comparaison, il s'agit d'une approche plus sûre et plus fiable.