Dans PHP, Array_Diff () est une fonction très courante qui peut trouver les différences entre les tableaux. Mais lorsque nous l'utilisons pour faire face à un tableau associatif dans des projets réels, si nous ne comprenons pas comment cela fonctionne, nous pouvons tomber dans de nombreux "fosses".
Cet article expliquera en profondeur le comportement de Array_Diff () , les malentendus communs et certaines techniques pratiques dans le traitement associatif des tableaux.
$array1 = ['a' => 'apple', 'b' => 'banana', 'c' => 'cherry'];
$array2 = ['a' => 'apple', 'b' => 'blueberry'];
$result = array_diff($array1, $array2);
print_r($result);
Sortir:
Array
(
[b] => banana
[c] => cherry
)
Explication: Array_Diff () ne compare que la "valeur" et ignore le nom de la clé . Dans cet exemple, bien que les clés de $ array1 ['b'] = 'banana' soient les mêmes que $ array2 ['b'] = 'Blueberry' , 'Banana' est considérée comme l'une des différences dues aux différentes valeurs.
Idée fausse: de nombreux développeurs pensent que Array_Diff () comparera les paires de valeurs clés.
$a = ['id' => 1, 'name' => 'John'];
$b = ['name' => 'John', 'id' => 2];
var_dump(array_diff($a, $b));
Sortir:
array(1) {
["id"]=>
int(1)
}
Bien que 'name' => 'John' soit le même dans les deux tableaux, car array_diff () ne regarde pas la clé, il se concentre uniquement sur la question de savoir si la valeur existe. Donc 'id' => 1 est considéré comme différent car 1 n'est pas dans la valeur de $ b .
? Solution: si vous souhaitez comparer les clés et les valeurs en même temps, il est recommandé d'utiliser array_diff_assoc () :
array_diff_assoc($a, $b);
Il comparera les clés et les valeurs en même temps, en évitant cette "illusion".
$a = ['value1' => 123];
$b = ['value2' => '123'];
print_r(array_diff($a, $b));
Sortir:
Array
(
)
Pit Point: Array_Diff () utilise une comparaison stricte du bien ou du mal ( == ), donc 123 et «123» sont considérés comme les mêmes.
? Astuce: si vous avez besoin d'une comparaison stricte (les valeurs et les types doivent être cohérents), vous pouvez utiliser la variante Array_Diff_Uassoc de Array_Diff () avec une fonction de comparaison personnalisée.
$result = array_udiff($a, $b, function($a, $b) {
return $a === $b ? 0 : ($a > $b ? 1 : -1);
});
Array_Diff () est un outil de tableau unidimensionnel , et pour les tableaux multidimensionnels, il ne se compare pas récursivement.
$a = ['info' => ['id' => 1, 'name' => 'Tom']];
$b = ['info' => ['id' => 1, 'name' => 'Tom']];
print_r(array_diff($a, $b));
Sortir:
Array
(
[info] => Array
(
[id] => 1
[name] => Tom
)
)
Cause: La valeur du type de tableau est traitée comme une chaîne dans array_diff () , et elle ne peut pas dire directement si le contenu des deux tableaux est égal.
? Solution: Si vous souhaitez comparer les tableaux multidimensionnels, vous devez écrire des fonctions récursives manuellement ou les comparer avec la conversion de sérialisation:
$a_serialized = array_map('serialize', $a);
$b_serialized = array_map('serialize', $b);
$diff = array_diff($a_serialized, $b_serialized);
Supposons que vous tirez un élément de données de la base de données à $ original , l'utilisateur soumet un formulaire à $ new_data , et vous voulez savoir quels champs ont changé:
$original = ['name' => 'Alice', 'email' => 'a@m66.net'];
$new_data = ['name' => 'Alice', 'email' => 'alice@m66.net'];
$changed = array_diff_assoc($new_data, $original);
De cette façon, vous pouvez obtenir avec précision quels champs ont été modifiés par l'utilisateur.
Vous avez deux tableaux de configuration $ config1 et $ config2 :
$config1 = include 'http://m66.net/config/old.php';
$config2 = include 'http://m66.net/config/new.php';
$diff = array_diff_assoc($config2, $config1);
Cela permet un accès facile aux modifications de configuration, particulièrement adaptées à l'écriture dans des scripts automatisés.
méthode | Comparez le contenu | Si la distinction entre les types | Adapté aux scènes |
---|---|---|---|
array_diff () | Comparez les valeurs uniquement | Non | Comparaison de valeur simple |
array_diff_assoc () | Comparez la valeur + le nom de la clé | Non | Formulaire, comparaison de configuration |
array_udiff () | Méthode de comparaison personnalisée | Personnalisable | Comparaison de type strict |
sérialiser + array_diff () | Comparaison multidimensionnelle du tableau | Non (évolutif) | Comparaison de structure multidimensionnelle |
Lorsque vous utilisez Array_Diff () , soyez clair sur ce que vous comparez. Ne soyez pas induit en erreur par les noms clés et n'oubliez pas l'impact du type. Ce n'est qu'en comprenant ces principes que vous pouvez vraiment utiliser cette fonction d'outil.
Si vous rencontrez des besoins de comparaison spéciaux dans votre projet, veuillez écrire une logique d'encapsulation de la fonction de gadget à la main - cela améliore non seulement la lisibilité du code, mais réduit également la probabilité de pénétrer dans une fosse.