Función PHP array_intersect_assoc
La función array_intersect_assoc en PHP compara dos o más arrays y devuelve solo los elementos que coinciden en clave y valor en todos los arrays.
La función PHP array_intersect_assoc() compara dos o más arrays y devuelve únicamente las entradas que coinciden en clave y valor en todos los arrays. A diferencia de array_intersect(), que ignora las claves y solo examina los valores, array_intersect_assoc() conserva un par únicamente cuando la misma clave contiene el mismo valor en todos los arrays que se pasan. Esto la convierte en la herramienta adecuada cuando la posición o la etiqueta de un valor importa tanto como el valor en sí — por ejemplo, al comparar dos arrays de configuración o dos filas indexadas por nombre de campo.
Esta página cubre la firma de la función, cómo funciona la comparación en la práctica (incluyendo un detalle sutil sobre cómo se comparan los valores), varios ejemplos ejecutables, errores comunes y funciones relacionadas.
Sintaxis
array_intersect_assoc(array $array, array ...$arrays): array$array— el array base. El resultado preserva sus claves y tipos de valor....$arrays— uno o más arrays con los que comparar. Se debe pasar al menos uno.
La función devuelve un nuevo array que contiene cada par clave => valor del primer array cuya clave y valor aparezcan también en todos los demás arrays.
Cómo funciona
array_intersect_assoc() recorre cada par clave => valor del primer array y busca la misma clave en todos los demás arrays. Un par sobrevive solo cuando, en cada uno de los otros arrays, esa clave existe y su valor es igual.
Un detalle que suele confundir: la comparación de valores no es estricta (===). Internamente PHP compara los valores como cadenas, aproximadamente (string) $a === (string) $b. Por tanto, 1 (int) coincide con "1" (string) porque ambos se convierten a "1", pero false no coincide con 0 (se convierten a "" y "0" respectivamente). Las claves, como siempre en los arrays de PHP, siguen las reglas normales de claves de array.
Ejemplo básico
Aquí el único par compartido por ambos arrays — misma clave, mismo valor — es "a" => "green":
La salida de este código sería:
Array
(
[a] => green
)"b" se descarta porque los valores difieren (brown vs yellow), y "c" se descarta por la misma razón (blue vs red). El "red" sin clave en $array1 tiene la clave entera 0, que no existe en $array2, por lo que también queda excluido. Esta es la diferencia con array_intersect(), que habría emparejado red solo por el valor.
Comparar tres o más arrays
Un par debe coincidir en todos los arrays para sobrevivir. Añadir un tercer array reduce aún más el resultado:
<?php
$array1 = array("a" => "green", "b" => "brown", "c" => "blue");
$array2 = array("a" => "green", "b" => "yellow");
$array3 = array("a" => "green", "c" => "blue");
$result = array_intersect_assoc($array1, $array2, $array3);
print_r($result);
?>Salida:
Array
(
[a] => green
)Solo "a" => "green" aparece en todos los arrays. "c" => "blue" no está en $array2, así que se descarta.
Advertencia: comparación de valores laxa
Como los valores se comparan como cadenas, los valores de tipos mixtos pueden coincidir de formas inesperadas:
<?php
$a = array("id" => 1, "active" => false);
$b = array("id" => "1", "active" => 0);
print_r(array_intersect_assoc($a, $b));
?>Salida:
Array
(
[id] => 1
)id coincide porque 1 y "1" se convierten ambos a "1". Pero active se descarta: false se convierte a "" mientras que 0 se convierte a "0", por lo que no son iguales. Si necesitas una comparación estricta con tipos, compara los arrays manualmente o usa array_uintersect_assoc() con un callback personalizado.
Cuándo usarla
- Al comparar arrays asociativos donde un valor solo tiene sentido en su clave específica — configuraciones, campos de formulario, estructuras similares a filas de base de datos.
- Para encontrar las entradas comunes entre dos instantáneas de los mismos datos indexados por clave.
Si solo te importa que los valores coincidan sin importar la clave, usa array_intersect(). Si solo te importa que las claves coincidan sin importar el valor, usa array_intersect_key(). Para la operación inversa — entradas presentes en el primer array pero no en los demás, comparadas por clave y valor — consulta array_diff_assoc().
Diagrama
Una representación visual de cómo array_intersect_assoc() filtra los pares:
graph LR
A[Array 1: key-value pairs] -->|Compare keys & values| B[Array 2: key-value pairs]
B -->|Keep only matching pairs| C[Result Array]Conclusión
array_intersect_assoc() devuelve los pares clave => valor comunes a todos los arrays que se le pasan, comparando tanto la clave como el valor (con comparación laxa de cadenas). Úsala cuando tanto la etiqueta como el valor de una entrada deban coincidir, y prefiere array_intersect(), array_intersect_key() o array_uintersect_assoc() cuando necesites coincidencia solo por valor, solo por clave o con una comparación personalizada estricta.