Entendiendo la función array_diff_uassoc de PHP
Aprende cómo funciona array_diff_uassoc en PHP para comparar arrays con verificación de claves y una función de comparación personalizada.
array_diff_uassoc() compara dos (o más) arrays con una verificación de clave adicional, y te permite proporcionar tu propia función para comparar las claves. Devuelve cada entrada del primer array cuyo par clave/valor no coincide en ninguno de los otros arrays. Esta página explica la firma de la función, muestra exactamente cómo funciona la comparación y describe cuándo conviene usarla en lugar de las funciones de diferencia de array más simples.
La "u" en el nombre significa suministrada por el usuario (user-supplied key comparison); "assoc" indica que las claves también se verifican (una comparación asociativa).
Firma
array_diff_uassoc(
array $array,
array ...$arrays,
callable $key_compare_func
): array$array— el array del que se compara origen. Sus entradas aparecen en el resultado.$arrays— uno o más arrays contra los que se compara.$key_compare_func— un callbackfn(mixed $a, mixed $b): intque devuelve0cuando dos claves se consideran iguales, y un entero negativo/positivo en caso contrario (el mismo contrato<=>que usausort). Las funciones integradas comostrcasecmpencajan en esta forma.
Devuelve un nuevo array; los arrays originales no se modifican.
Cómo funciona la comparación
Esta es la parte que confunde a la gente. array_diff_uassoc() conserva una entrada de $array solo si ambas de las siguientes condiciones son verdaderas en los otros arrays:
- El valor no coincide (los valores se comparan con la regla predeterminada y no estricta
==tras convertirlos a string — la misma regla que usaarray_diff()), o - La clave no coincide según tu
$key_compare_func.
Dicho de otro modo: una entrada se descarta solo cuando otro array contiene el mismo valor bajo una clave que tu callback considera igual. Por lo tanto, el callback personalizado gobierna las claves; los valores siguen comparándose con la regla integrada de PHP. Ese último punto es la confusión más frecuente — el callback es solo para las claves.
Ejemplo
Comparar listas de precios con claves sin distinción entre mayúsculas y minúsculas
Salida:
Array
(
[Banana] => 0.5
[Cherry] => 3
)Recorriendo cada entrada de $prices:
Apple => 1.20—strcasecmp("Apple", "apple")es0, por lo que las claves coinciden, y el valor1.20también coincide con$updated["apple"]. Ambos coinciden, por lo que se descarta.Banana => 0.50— las claves coinciden (strcasecmp("Banana", "banana") === 0), pero los valores difieren (0.50vs0.75). Como el valor no coincide, la entrada se conserva.Cherry => 3.00— ninguna clave en$updatedcoincide, por lo que se conserva.
Esto muestra la regla en acción: una clave coincidente sola no es suficiente para eliminar una entrada — el valor también debe coincidir.
Funciones diff relacionadas
array_diff_uassoc() forma parte de una familia de funciones de diferencia de array. Elige la que mejor se adapte a tu estrategia de comparación:
array_diff()— compara solo los valores; las claves se ignoran.array_diff_assoc()— compara claves y valores con las reglas integradas (sin callbacks).array_diff_key()— compara solo las claves, con comparación integrada.array_diff_ukey()— compara solo las claves, pero con un callback para las claves.array_udiff()— compara valores con un callback; claves ignoradas.array_udiff_assoc()— callback para los valores, verificación integrada en las claves.array_udiff_uassoc()— callbacks para ambos, valores y claves.
¿Cuándo deberías usarla?
Usa array_diff_uassoc() cuando las claves importan en la comparación pero la coincidencia de claves predeterminada es demasiado estricta — por ejemplo, cuando las claves difieren solo en mayúsculas/minúsculas o formato, o cuando las claves son objetos/valores que requieren lógica personalizada para considerarse "iguales". Si solo te importan los valores, usa array_udiff(); si también necesitas un callback para los valores, usa array_udiff_uassoc().
Conclusión
array_diff_uassoc() devuelve las entradas del primer array que no tienen una coincidencia de clave/valor en los otros arrays, usando un callback que tú proporcionas para decidir cuándo dos claves son iguales. Recuerda que los valores siguen comparándose con la regla integrada de PHP — una entrada sobrevive a menos que tanto su clave como su valor coincidan en otro array.