Entendendo a Função array_intersect_uassoc() do PHP
Aprenda como usar array_intersect_uassoc() no PHP para calcular interseções de arrays com comparação de chaves personalizada.
array_intersect_uassoc() calcula a interseção de dois ou mais arrays — ela retorna as entradas do primeiro array cujo valor E chave também aparecem em todos os outros arrays. O que torna essa variante especial é o u no seu nome: você fornece um callback definido pelo usuário que decide quando duas chaves são consideradas iguais. Os valores ainda são comparados com a comparação embutida do PHP (solta, com conversão para string).
Esta página explica como a função funciona, apresenta um exemplo verificado e mostra quando utilizá-la em vez das outras variantes array_intersect_*.
Sintaxe
array_intersect_uassoc(
array $array,
array ...$arrays,
callable $key_compare_func
): array$array— o array a ser comparado; suas entradas aparecem no resultado....$arrays— um ou mais arrays para comparar com o primeiro.$key_compare_func— um callback que compara duas chaves. Ele deve retornar um inteiro menor que, igual a, ou maior que0quando a primeira chave é considerada menor que, igual a, ou maior que a segunda (o mesmo contrato de um comparadorusort).
A função retorna um novo array contendo as entradas correspondentes de $array, preservando suas chaves originais.
Como funciona o callback de chave
Diferente de array_intersect_assoc(), que compara chaves com ===, esta função delega a comparação de chaves ao seu callback. Isso permite implementar regras de correspondência que o PHP não oferece nativamente — chaves sem diferenciação entre maiúsculas e minúsculas, chaves com espaços removidos ou ordenação conforme localidade.
Note a responsabilidade dividida: as chaves são comparadas pelo seu callback, mas os valores ainda são comparados pela própria função (de forma solta, como strings). Se você também precisar de uma comparação de valores personalizada, use array_uintersect_uassoc().
Exemplo
<?php
// The callback receives two keys and must return an int:
// 0 = equal, -1 = first is smaller, 1 = first is larger.
function compareKeys($key1, $key2) {
if ($key1 === $key2) {
return 0;
}
return ($key1 > $key2) ? 1 : -1;
}
$array1 = ["a" => "green", "b" => "brown", "c" => "blue", "red"];
$array2 = ["a" => "green", "yellow", "red"];
$result = array_intersect_uassoc($array1, $array2, "compareKeys");
print_r($result);
?>Saída:
Array
(
[a] => green
)Apenas "a" => "green" sobrevive, pois é a única entrada cuja chave e valor aparecem em $array2:
"b" => "brown"e"c" => "blue"— as chaves não existem em$array2.0 => "red"em$array1— o valor"red"existe em$array2, mas na chave1, portanto as chaves (0vs1) não correspondem.
Quando usar
Utilize array_intersect_uassoc() quando precisar de uma interseção com reconhecimento de chave e as chaves exigirem lógica de correspondência personalizada. Um caso comum é a correspondência de cabeçalhos ou colunas sem diferenciação entre maiúsculas e minúsculas:
<?php
function ci_keys($k1, $k2) {
return strcasecmp((string) $k1, (string) $k2);
}
$config = ["Host" => "localhost", "Port" => 8080];
$expected = ["host" => "localhost", "PORT" => 8080];
print_r(array_intersect_uassoc($config, $expected, "ci_keys"));
?>Isso mantém Host => localhost e Port => 8080 porque o callback trata Host/host e Port/PORT como a mesma chave, enquanto os valores ainda correspondem.
Funções relacionadas
| Função | Comparação de chave | Comparação de valor |
|---|---|---|
array_intersect() | ignorada | embutida |
array_intersect_assoc() | === | embutida |
array_intersect_key() | === (somente chaves) | ignorada |
array_intersect_ukey() | callback (somente chaves) | ignorada |
array_intersect_uassoc() | callback | embutida |
array_uintersect_uassoc() | callback | callback |
Conclusão
array_intersect_uassoc() retorna as entradas do primeiro array cujo valor e chave aparecem em todos os outros arrays, permitindo que você controle a correspondência de chaves por meio de um callback definido pelo usuário. Use-a quando uma interseção associativa precisar de regras de chave flexíveis — como chaves sem diferenciação entre maiúsculas e minúsculas ou com espaços removidos — e lembre-se de que os valores ainda são comparados com a comparação embutida do PHP.