W3docs

Función PHP Array Diff - Una Guía Completa

La función array_diff_ukey de PHP compara arrays y devuelve las diferencias entre ellos basándose en una función de comparación de claves personalizada.

Función PHP array_diff_ukey() - Una Guía Completa

En PHP, la función array_diff_ukey() es una herramienta poderosa que puede ayudarte a comparar arrays y devolver la diferencia entre ellos basándose en una función de comparación de claves personalizada. En este artículo, veremos más de cerca cómo funciona esta función y cómo puedes usarla en tus proyectos PHP.

Firma de la Función y Parámetros

array_diff_ukey(array $array, array ...$arrays, callable $key_compare_func): array

Esta es la notación del manual de PHP para la función. En tiempo de ejecución, el último argumento que pasas es siempre el callback de comparación; cada argumento anterior se trata como un array.

Parámetros:

  • $array: El array base contra el que se compara.
  • $arrays: Uno o más arrays para comparar con el array base.
  • $key_compare_func: Un callable que compara dos claves y devuelve un entero menor que, igual a, o mayor que cero (el mismo contrato que un comparador de usort).

Retorna: Un array que contiene las entradas de $array cuyas claves no están presentes en ninguno de los otros arrays. Los valores nunca se inspeccionan — solo las claves.

¿Cuándo lo usaría?

La mayoría de las veces array_diff_key() es suficiente: elimina entradas cuyas claves aparecen en otros arrays usando una comparación de claves estilo === simple. Recurre a array_diff_ukey() solo cuando "¿es esta clave la misma?" necesita lógica personalizada — por ejemplo, tratar las claves sin distinguir mayúsculas de minúsculas, comparar solo el prefijo de una clave, o normalizar strings numéricos antes de la coincidencia. Si necesitas comparar valores con un callback, consulta array_udiff(); para comparar tanto claves como valores, consulta array_diff_uassoc().

¿Cómo Funciona la Función PHP array_diff_ukey()?

La función array_diff_ukey() toma dos o más arrays como argumentos y compara sus entradas basándose en la función de comparación de claves que proporcionas. La función de comparación de claves debe devolver un entero menor que, igual a, o mayor que cero, dependiendo del resultado de la comparación.

Si el resultado de la comparación es menor que cero, el primer argumento se considera menor que el segundo. Si el resultado es mayor que cero, el primer argumento se considera mayor que el segundo. Si el resultado es igual a cero, los dos argumentos se consideran iguales.

Usando la Función PHP array_diff_ukey()

Aquí tienes un ejemplo de cómo puedes usar la función array_diff_ukey() en PHP:

Ejemplo PHP del uso de la función array_diff_ukey

<?php

function key_compare_func($a, $b)
{
    if ($a === $b) {
        return 0;
    }
    return ($a > $b)? 1:-1;
}

$array1 = ["a" => "green", "b" => "brown", "c" => "blue", "red"];
$array2 = ["a" => "green", "yellow", "red"];
$result = array_diff_ukey($array1, $array2, 'key_compare_func');
print_r($result);

?>

En este ejemplo, la función array_diff_ukey() se utiliza para comparar las entradas en $array1 y $array2 basándose en una función de comparación de claves personalizada llamada key_compare_func. El array resultante, almacenado en $result, contiene las entradas de $array1 que no están presentes en $array2.

Nota: En el callback, $a y $b representan las claves de los arrays, no los valores.

Salida:

Array
(
    [b] => brown
    [c] => blue
)

Analicémoslo: $array1 tiene las claves a, b, c y 0 (el "red" sin clave recibe la clave entera 0). $array2 tiene las claves a, 0 y 1. Las claves a y 0 existen en ambos arrays, por lo que array_diff_ukey() elimina "green" y "red" del resultado, dejando solo las entradas cuyas claves (b, c) son únicas en $array1.

Función de Comparación de Claves Personalizada

La función de comparación de claves personalizada es una parte fundamental de la función array_diff_ukey(), ya que determina cómo se comparan las entradas en los dos arrays. Aquí tienes un ejemplo de una función de comparación de claves personalizada:

Ejemplo PHP de función de comparación de claves de array personalizada

function key_compare_func($a, $b)
{
    if ($a === $b) {
        return 0;
    }
    return ($a > $b)? 1:-1;
}

En este ejemplo, la función key_compare_func() devuelve 0 si los dos argumentos son iguales, 1 si el primer argumento es mayor que el segundo, y -1 si el primer argumento es menor que el segundo.

Nota sobre la Conversión de Tipos: Al comparar claves de tipos mixtos (por ejemplo, strings e enteros), la comparación laxa de PHP en tu callback puede dar lugar a resultados inesperados. Asegúrate de que tu callback maneje explícitamente la conversión de tipos o use comparación estricta (===) si se requiere una coincidencia de tipos precisa.

Un caso práctico: comparar claves sin distinguir mayúsculas de minúsculas

El ejemplo anterior se comporta igual que el más simple array_diff_key(). El callback personalizado solo justifica su uso cuando la comparación en sí no es trivial — por ejemplo, hacer coincidir claves independientemente de las mayúsculas y minúsculas:

php— editable, runs on the server

Aunque "Host" y "PORT" difieren en mayúsculas de "host" y "port", strcasecmp los trata como claves iguales, por lo que se eliminan. Solo Debug, que no tiene contraparte en $defaults, sobrevive:

Array
(
    [Debug] => 1
)

Un simple array_diff_key() habría conservado las tres entradas, porque "Host" !== "host". Esa diferencia es precisamente cuándo array_diff_ukey() es la herramienta adecuada.

Conclusión

La función array_diff_ukey() compara arrays por sus claves usando un callback que tú proporcionas, devolviendo las entradas del primer array cuyas claves están ausentes de los demás. Úsala cuando la igualdad de claves necesita lógica personalizada; recurre al más sencillo array_diff_key() cuando basta con una comparación estricta de claves.

Funciones relacionadas que vale la pena conocer:

Práctica

Práctica
¿Cuál es el uso correcto de la función array_diff_ukey() en PHP?
¿Cuál es el uso correcto de la función array_diff_ukey() en PHP?
Was this page helpful?