Comprendre la fonction array_diff_uassoc de PHP
Découvrez array_diff_uassoc en PHP : comparez des tableaux avec une vérification des clés et une fonction de rappel personnalisée.
array_diff_uassoc() compare deux (ou plusieurs) tableaux avec une vérification supplémentaire des clés, et vous permet de fournir votre propre fonction pour comparer les clés. Elle retourne chaque entrée du premier tableau dont la paire clé/valeur n'est pas présente dans l'un des autres tableaux. Cette page explique la signature, décrit précisément le fonctionnement de la comparaison et indique quand l'utiliser plutôt que les fonctions de diff de tableau plus simples.
Le « u » dans le nom signifie comparaison de clés fournie par l'utilisateur ; « assoc » indique que les clés sont également vérifiées (comparaison associative).
Signature
array_diff_uassoc(
array $array,
array ...$arrays,
callable $key_compare_func
): array$array— le tableau à comparer depuis. Ses entrées apparaissent dans le résultat.$arrays— un ou plusieurs tableaux à comparer avec.$key_compare_func— un callbackfn(mixed $a, mixed $b): intqui retourne0lorsque deux clés sont considérées égales, et un entier négatif/positif sinon (le même contrat<=>utilisé parusort). Des fonctions intégrées commestrcasecmpcorrespondent à cette signature.
Elle retourne un nouveau tableau ; les tableaux d'origine ne sont pas modifiés.
Fonctionnement de la comparaison
C'est le point qui prête le plus à confusion. array_diff_uassoc() conserve une entrée de $array uniquement si les deux conditions suivantes sont vraies pour tous les autres tableaux :
- La valeur ne correspond pas (les valeurs sont comparées avec la règle classique et permissive
==après conversion en string — la même règle qu'utilisearray_diff()), ou - La clé ne correspond pas selon votre
$key_compare_func.
Autrement dit : une entrée est supprimée uniquement lorsqu'un autre tableau contient la même valeur sous une clé que votre callback considère égale. Le callback personnalisé régit donc les clés ; les valeurs sont toujours comparées selon la règle intégrée de PHP. Ce dernier point est la confusion la plus répandue — le callback ne concerne que les clés.
Exemple
Comparer des listes de prix avec des clés insensibles à la casse
Résultat :
Array
(
[Banana] => 0.5
[Cherry] => 3
)Analyse de chaque entrée de $prices :
Apple => 1.20—strcasecmp("Apple", "apple")vaut0, donc les clés correspondent, et la valeur1.20correspond également à$updated["apple"]. Les deux correspondent, l'entrée est donc supprimée.Banana => 0.50— les clés correspondent (strcasecmp("Banana", "banana") === 0), mais les valeurs diffèrent (0.50contre0.75). Comme la valeur ne correspond pas, l'entrée est conservée.Cherry => 3.00— aucune clé de$updatedne correspond, l'entrée est donc conservée.
Cela illustre la règle en action : une clé correspondante seule ne suffit pas à supprimer une entrée — la valeur doit également correspondre.
Fonctions de diff associées
array_diff_uassoc() fait partie d'une famille de fonctions de différence de tableaux. Choisissez celle dont la stratégie de comparaison correspond à vos données :
array_diff()— compare uniquement les valeurs ; les clés sont ignorées.array_diff_assoc()— compare les clés et les valeurs avec les règles intégrées (sans callback).array_diff_key()— compare uniquement les clés, avec la comparaison intégrée.array_diff_ukey()— compare uniquement les clés, mais avec un callback pour les clés.array_udiff()— compare les valeurs avec un callback ; les clés sont ignorées.array_udiff_assoc()— callback pour les valeurs, vérification intégrée des clés.array_udiff_uassoc()— callbacks pour les valeurs et les clés.
Quand l'utiliser ?
Utilisez array_diff_uassoc() lorsque les clés sont importantes pour la comparaison mais que la correspondance de clés par défaut est trop stricte — par exemple lorsque les clés diffèrent uniquement par la casse ou le formatage, ou lorsque les clés sont des objets ou des valeurs nécessitant une logique personnalisée pour être considérées « égales ». Si seules les valeurs vous intéressent, utilisez array_udiff() ; si vous avez également besoin d'un callback pour les valeurs, utilisez array_udiff_uassoc().
Conclusion
array_diff_uassoc() retourne les entrées du premier tableau qui n'ont aucune correspondance clé/valeur dans les autres tableaux, en utilisant un callback que vous fournissez pour décider quand deux clés sont égales. Rappelez-vous que les valeurs sont toujours comparées selon la règle intégrée de PHP — une entrée est conservée sauf si sa clé et sa valeur sont toutes deux trouvées ailleurs.