La fonction array_diff_assoc () est un élément utilisé en PHP pour comparer deux tableaux ou plus et renvoie un tableau contenant des éléments qui existent dans le premier tableau mais pas dans d'autres tableaux. Contrairement à la fonction array_diff () , array_diff_assoc () compare les noms de clés et les valeurs de clé du tableau en même temps. Si le nom de la clé et la valeur clé correspondent, il sera exclu.
Cependant, dans le développement réel, lorsque les types de noms de clés de tableaux sont incohérents, l'utilisation de Array_Diff_assoc () peut provoquer un comportement inattendu. Cet article expliquera pourquoi les types de noms de clés incohérents peuvent causer des problèmes et fournir des solutions pour éviter cela.
PHP est un langage faiblement typé, ce qui signifie qu'il convertira automatiquement le type. Par exemple, les noms de clés 1 (entier) et «1» (chaîne) dans un tableau sont égaux par rapport à compamer. Cette conversion automatique peut provoquer des types de noms de clés de tableau incohérentes, ce qui augmente une erreur lors de l'utilisation de Array_Diff_assoc () .
Considérez le code suivant:
<?php
$array1 = array(1 => 'apple', '1' => 'orange');
$array2 = array(1 => 'banana', '1' => 'orange');
$result = array_diff_assoc($array1, $array2);
print_r($result);
?>
Dans cet exemple, $ array1 et $ array2 contiennent tous deux des noms de clés 1 et «1» . Étant donné que PHP convertira automatiquement «1» en Integer 1 , ces deux noms de clés sont considérés comme les mêmes. Par conséquent, array_diff_assoc () pense que les valeurs clés de ces deux tableaux sont exactement les mêmes, et en fait, elles devraient être différentes.
Règles de comparaison du nom de clé : array_diff_assoc () compare non seulement les valeurs du tableau, mais compare également les noms de clés. PHP est strict pour comparer les noms de clés, donc différents types de noms de clés affecteront les résultats de comparaison du tableau.
Conversion de type automatique : Parce que PHP effectue une conversion de type automatique lors de la comparaison, les différences dans les types de noms de clé (telles que 1 et «1» ) sont ignorées, ce qui peut entraîner un comportement inattendu. Par exemple, dans l'exemple ci-dessus, le résultat array_diff_assoc () est un tableau vide car 1 et «1» sont considérés comme égaux.
Difficile de déboguer : ce type d'incohérence peut ne pas apparaître immédiatement, en particulier dans les grandes applications. Cela peut entraîner un renvoi de résultats incorrects dans certains cas, qui sont difficiles à détecter et à corriger.
Unifier explicitement Types de noms de clé : Avant d'utiliser array_diff_assoc () , assurez-vous que les types de noms de clé du tableau sont cohérents. Tous les noms de clés peuvent être convertis en même type à l'aide des fonctions intVal () ou strVal () .
Par exemple, convertissez tous les noms de clés en chaînes:
<?php
$array1 = array('1' => 'apple', 1 => 'orange');
$array2 = array(1 => 'banana', '1' => 'orange');
// Convertir tous les noms de clés en chaînes
$array1 = array_map(function($key) { return strval($key); }, array_keys($array1));
$array2 = array_map(function($key) { return strval($key); }, array_keys($array2));
$result = array_diff_assoc($array1, $array2);
print_r($result);
?>
Utilisez Array_Diff () au lieu de Array_Diff_assoc () : Si vous vous souciez uniquement de la valeur du tableau et non du nom de clé, envisagez d'utiliser Array_Diff () . Array_Diff () ne compare pas les noms clés du tableau, mais compare uniquement les valeurs, qui peuvent éviter les problèmes causés par des noms de clés incohérents.
Utiliser la coulée : Dans certains cas, la coulée est utilisée pour assurer la cohérence des noms de clés. Le type de nom de clé d'un tableau peut être explicitement converti à l'aide de (int) ou (chaîne) .
<?php
$array1 = array(1 => 'apple', '1' => 'orange');
$array2 = array(1 => 'banana', '1' => 'orange');
// Le nom de la clé coulée est un entier
$array1 = array_map(function($key) { return (int) $key; }, array_keys($array1));
$array2 = array_map(function($key) { return (int) $key; }, array_keys($array2));
$result = array_diff_assoc($array1, $array2);
print_r($result);
?>
Vérifiez complètement le type de nom de clé d'un tableau : Avant d'effectuer une comparaison du tableau, vous pouvez utiliser var_dump () ou getType () pour vérifier les types de noms de clés dans le tableau pour vous assurer qu'ils sont les mêmes.
<?php
var_dump(array_keys($array1));
var_dump(array_keys($array2));
?>
Grâce à ces mesures, vous pouvez éviter efficacement l'utilisation de array_diff_assoc () en raison de types de noms de clé incohérents.