Função PHP Array Intersect_Assoc
A função array_intersect_assoc no PHP compara dois ou mais arrays e retorna apenas os elementos que coincidem em chave e valor em todos os arrays.
A função PHP array_intersect_assoc() compara dois ou mais arrays e retorna apenas as entradas que coincidem em chave e valor em todos os arrays. Ao contrário de array_intersect(), que ignora as chaves e analisa apenas os valores, array_intersect_assoc() mantém um par somente quando a mesma chave contém o mesmo valor em todos os arrays fornecidos. Isso a torna a ferramenta certa quando a posição ou o rótulo de um valor é tão importante quanto o próprio valor — por exemplo, comparar dois arrays de configuração ou duas linhas indexadas por nome de campo.
Esta página aborda a assinatura da função, como a comparação funciona de fato (incluindo um detalhe sutil sobre como os valores são comparados), vários exemplos executáveis, armadilhas comuns e funções relacionadas.
Sintaxe
array_intersect_assoc(array $array, array ...$arrays): array$array— o array base. O resultado preserva suas chaves e tipos de valores....$arrays— um ou mais arrays para comparar. É necessário passar pelo menos um.
A função retorna um novo array contendo cada par chave => valor do primeiro array cuja chave e valor também apareçam em todos os outros arrays.
Como funciona
array_intersect_assoc() percorre cada par chave => valor do primeiro array e busca a mesma chave em todos os outros arrays. Um par sobrevive apenas quando, para cada outro array, essa chave existe e seu valor é igual.
Um detalhe que confunde as pessoas: a comparação de valores não é estrita (===). Internamente, o PHP compara valores como strings, aproximadamente (string) $a === (string) $b. Portanto, 1 (int) corresponde a "1" (string) porque ambos resultam em "1" ao serem convertidos para string, mas false não corresponde a 0 (eles resultam em "" e "0", respectivamente). As chaves, como de costume nos arrays PHP, seguem as regras normais de chaves de array.
Exemplo básico
Aqui o único par compartilhado por ambos os arrays — mesma chave, mesmo valor — é "a" => "green":
A saída deste código seria:
Array
(
[a] => green
)"b" é descartado porque os valores diferem (brown vs yellow), e "c" é descartado pelo mesmo motivo (blue vs red). O "red" simples em $array1 tem a chave inteira 0, que não existe em $array2, então também é excluído. Esta é a diferença em relação a array_intersect(), que teria correspondido red apenas pelo valor.
Comparando três ou mais arrays
Um par deve coincidir em todos os arrays para sobreviver. Adicionar um terceiro array restringe ainda mais o 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);
?>Saída:
Array
(
[a] => green
)Apenas "a" => "green" aparece em todos os arrays. "c" => "blue" está ausente em $array2, por isso é descartado.
Armadilha: comparação de valores não estrita
Como os valores são comparados como strings, valores de tipos mistos podem corresponder de formas surpreendentes:
<?php
$a = array("id" => 1, "active" => false);
$b = array("id" => "1", "active" => 0);
print_r(array_intersect_assoc($a, $b));
?>Saída:
Array
(
[id] => 1
)id corresponde porque 1 e "1" resultam ambos em "1" ao serem convertidos para string. Mas active é descartado: false resulta em "" enquanto 0 resulta em "0", portanto não são iguais. Se você precisar de correspondência estrita com consciência de tipo, compare os arrays manualmente ou use array_uintersect_assoc() com um callback personalizado.
Quando usar
- Comparar arrays associativos em que um valor só é significativo em sua chave específica — configurações, campos de formulário, estruturas semelhantes a linhas de banco de dados.
- Encontrar as entradas comuns entre dois instantâneos dos mesmos dados indexados por chave.
Se você se importa apenas com valores correspondentes independentemente da chave, use array_intersect(). Se você se importa apenas com chaves correspondentes independentemente do valor, use array_intersect_key(). Para a operação oposta — entradas presentes no primeiro array mas não nos outros, comparadas por chave e valor — consulte array_diff_assoc().
Diagrama
Uma representação visual de como array_intersect_assoc() filtra os 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]Conclusão
array_intersect_assoc() retorna os pares chave => valor que são comuns a todos os arrays fornecidos, correspondendo tanto na chave quanto no valor (comparado de forma não estrita como string). Use-a quando tanto o rótulo quanto o valor de uma entrada precisam coincidir, e prefira array_intersect(), array_intersect_key() ou array_uintersect_assoc() quando precisar de correspondência apenas por valor, apenas por chave ou com correspondência personalizada estrita.