Dans PHP, la fonction Array_INTERSECT_UASSOC est utilisée pour comparer les clés et les valeurs de deux tableaux, renvoyant la pièce où les paires de valeurs de clé sont les mêmes dans les deux tableaux. Ce qui le rend différent de Array_INTERSECT_ASSOC , c'est que Array_INTERSECT_UASSOC permet aux utilisateurs de personnaliser la fonction de comparaison des touches.
La fonction est définie comme suit:
array_intersect_uassoc(array $array1, array $array2, callable $key_compare_func): array
$ array1 et $ array2 sont deux tableaux participant à la comparaison.
$ key_compare_func est une fonction définie par l'utilisateur pour comparer les clés, et la valeur de retour est similaire à Strcmp .
Lorsque l'ordre des paires de réseaux de valeurs clés est incohérent, Array_INTERSECT_UASSOC comparera toujours en fonction de la relation correspondante entre les clés et les valeurs. C'est-à-dire que les clés et les valeurs doivent être "égales" pour apparaître dans le résultat, quelle que soit leur ordre dans le tableau.
Par exemple:
<?php
$array1 = [
'a' => 1,
'b' => 2,
];
$array2 = [
'b' => 2,
'a' => 1,
];
$result = array_intersect_uassoc($array1, $array2, 'strcmp');
print_r($result);
Sortir:
Array
(
[a] => 1
[b] => 2
)
Même si l'ordre des paires de valeurs clés dans $ array2 est différent de $ array1 , le résultat contient toujours toutes les paires de valeurs clés correspondantes.
En supposant que votre fonction de comparaison personnalisée est sensible à l'ordre, elle peut entraîner des défaillances de correspondance. La fonction de comparaison de chaîne par défaut STRCMP est indépendante de l'ordre, mais si la fonction de comparaison que vous avez écrite contient de l'ordre ou d'autres conditions, le résultat peut être différent.
Si vous souhaitez vous assurer que les paires de valeurs clés peuvent correspondre correctement même si elles sont dans des ordres différents, vous pouvez suivre les suggestions suivantes:
Assurez-vous que la fonction de comparaison compare uniquement les valeurs de la clé elle-même et n'apporte pas une logique liée séquentielle.
Triez d'abord les clés du tableau , puis utilisez Array_INTERSECT_UASSOC pour comparaison pour éviter l'impact des différences de commande.
Exemple: trier d'abord puis comparer
<?php
$array1 = [
'b' => 2,
'a' => 1,
];
$array2 = [
'a' => 1,
'b' => 2,
];
// Triez les clés
ksort($array1);
ksort($array2);
$result = array_intersect_uassoc($array1, $array2, 'strcmp');
print_r($result);
De cette façon, même si l'ordre initial est différent, l'ordre sera cohérent après le tri, évitant les résultats inattendus possibles des différences de commande.
Array_INTERSECT_UASSOC compare les clés et les valeurs, et l'ordre lui-même n'affecte pas le résultat correspondant.
Les fonctions de comparaison des clés personnalisées devraient éviter d'inclure une logique séquentiellement liée.
Pour être sûr, vous pouvez utiliser KSORT () pour trier les tableaux participant d'abord à la comparaison pour assurer l'ordre uniforme.
<?php
$array1 = [
'b' => 2,
'a' => 1,
];
$array2 = [
'a' => 1,
'b' => 2,
];
ksort($array1);
ksort($array2);
$result = array_intersect_uassoc($array1, $array2, 'strcmp');
print_r($result);