Dans PHP, la fonction Array_Diff_ukey est utilisée pour comparer les noms de clés de deux tableaux et renvoyer les parties du premier tableau qui sont différentes des noms de clés du deuxième tableau. Lors du traitement des noms de clés du tableau, cette fonction utilise une fonction de rappel définie par l'utilisateur pour comparer les noms de clés. De nombreux développeurs ignorent souvent un problème très important lors de l'utilisation de cette fonction - cohérence de cas des noms de clés du tableau.
La fonction Array_Diff_ukey accepte trois paramètres:
array_diff_ukey(array $array1, array $array2, callable $key_compare_func): array
$ array1 : le premier tableau
$ array2 : le deuxième tableau
$ key_compare_func : une fonction de rappel qui compare deux noms de clés de tableau. La fonction de rappel doit accepter deux noms de clés comme paramètres et renvoyer un entier inférieur à, égal ou supérieur à zéro (similaire à la fonction STRCMP ).
Par exemple, le code suivant montre comment utiliser la fonction array_diff_ukey :
$array1 = [
"a" => "apple",
"b" => "banana",
"c" => "cherry"
];
$array2 = [
"A" => "apple",
"B" => "banana"
];
$result = array_diff_ukey($array1, $array2, "strnatcmp");
print_r($result);
Dans cet exemple, Array_Diff_ukey comparera les noms de clés de $ array1 et $ array2 et renverra les noms de clés et leurs valeurs dans le premier tableau qui n'apparaissent pas dans le deuxième tableau. Lors de l'utilisation de la fonction de comparaison strNatcmp , le cas du nom de clé est pris en compte.
Bien que la fonction Array_Diff_ukey puisse gérer la comparaison du nom de clé via des fonctions de comparaison personnalisées, si la fonction de comparaison ne gère pas bien les problèmes de cas, cela peut entraîner des résultats inattendus.
Par exemple, considérez le code suivant:
$array1 = [
"foo" => "bar",
"Bar" => "baz"
];
$array2 = [
"FOO" => "bar"
];
$result = array_diff_ukey($array1, $array2, "strnatcmp");
print_r($result);
Dans l'exemple ci-dessus, puisque Strnatcmp est sensible à la casse, Array_Diff_ukey considérera "FOO" et "FOO" comme des noms de clés différents. La sortie sera donc:
Array
(
[foo] => bar
[Bar] => baz
)
Cela montre comment la fonction array_diff_ukey se comporte par défaut: il ignore la cohérence du cas de nom de clé. Si le développeur s'attend à des comparaisons insensibles à des cas, il est nécessaire de gérer les conversions de cas dans une fonction de comparaison personnalisée.
Pour résoudre le problème de l'incohérence des cas, les développeurs peuvent rédiger une fonction de comparaison insensible à la cas. Par exemple, vous pouvez utiliser Strtolower ou Strtoupper pour utiliser uniformément les minuscules ou les majuscules et comparer:
$array1 = [
"foo" => "bar",
"Bar" => "baz"
];
$array2 = [
"FOO" => "bar"
];
$result = array_diff_ukey($array1, $array2, function($key1, $key2) {
return strcmp(strtolower($key1), strtolower($key2));
});
print_r($result);
De cette façon, Array_Diff_ukey ne sera plus sensible à la casse et la sortie sera:
Array
(
[Bar] => baz
)
Lorsque vous utilisez la fonction Array_Diff_ukey , les développeurs doivent prêter attention au cas des noms de clés. Si la cohérence des cas n'est pas gérée correctement, certaines erreurs inattendues et comportements incohérents peuvent être causés. Par conséquent, lors de l'écriture de fonctions de comparaison personnalisées, assurez-vous de prendre en compte les différences de cas, en particulier lorsque vous traitez des noms de clés. Si vous souhaitez faire une comparaison insensible à la casse, vous pouvez utiliser Strtolower ou Strtoupper dans la fonction de comparaison pour unifier le cas du nom de clé.
Cela peut éviter les problèmes causés par des cas incohérents pendant le développement.