Guia Completo da Função PHP array_uintersect_assoc
Aprenda como o PHP array_uintersect_assoc() calcula a interseção de arrays com verificação de índice e um callback de comparação de valores definido pelo usuário.
array_uintersect_assoc() calcula a interseção de dois ou mais arrays com uma verificação adicional de índice, onde os valores são comparados por um callback fornecido por você, mas as chaves são comparadas com a comparação embutida (não estrita). Ela retorna as entradas do primeiro array cuja chave e valor também aparecem em todos os outros arrays.
O "u" no nome significa comparação de valor definida pelo usuário; o sufixo _assoc significa as chaves também são verificadas. Portanto, um elemento sobrevive apenas quando ambas as condições são verdadeiras:
- sua chave existe em todos os outros arrays (comparada pela comparação padrão do PHP), e
- seu callback indica que seu valor é igual ao elemento correspondente em todos os outros arrays.
Isso o torna o primo mais rigoroso de array_intersect(), que ignora chaves e usa comparação de string. Use array_uintersect_assoc() quando a correspondência de chaves importa e você precisa de correspondência de valores personalizada — por exemplo, correspondência sem distinção de maiúsculas e minúsculas, comparação de objetos ou correspondência de números com tolerância.
Sintaxe
array_uintersect_assoc(array $array1, array $array2, ...$arrays, callable $value_compare_func): arrayO callback é sempre o último argumento. Tudo antes dele é um array a ser intersectado.
Parâmetros
| Parâmetro | Descrição |
|---|---|
$array1 | O array base. As chaves e valores deste array são preservados no resultado. |
$array2, ... | Um ou mais arrays para comparar com $array1. |
$value_compare_func | Um callback que compara dois valores e retorna um inteiro. |
Valor de retorno
Um array associativo contendo cada entrada de $array1 cuja chave está presente em todos os outros arrays e cujo valor o callback considera igual em todos eles. As chaves são preservadas de $array1.
A função de callback
O callback recebe dois valores e deve retornar um inteiro que os ordena, exatamente como as funções de comparação usadas por usort():
0quando os dois valores são considerados iguais,- um número negativo (
< 0) quando o primeiro é "menor que" o segundo, - um número positivo (
> 0) quando o primeiro é "maior que" o segundo.
Dois valores são tratados como correspondência apenas quando o callback retorna 0. Funções embutidas como strcasecmp() (comparação de string sem distinção de maiúsculas e minúsculas) e strcmp() já seguem esse contrato, por isso podem ser passadas diretamente.
Exemplos
Exemplo 1: Interseção básica em três arrays
Saída:
Array
(
[c] => cherry
)Apenas c => cherry sobrevive. apple está em $array1 e $array3, mas ausente de $array2; banana está em $array1 e $array2, mas ausente de $array3. Apenas cherry aparece sob a mesma chave c nos três arrays, então é a única correspondência. Observe que a chave c é preservada de $array1.
Exemplo 2: Correspondência de valores sem distinção de maiúsculas e minúsculas
Saída:
Array
(
[c] => Cherry
)Os valores diferem em capitalização entre os arrays (Cherry vs cherry), mas como strcasecmp compara sem distinção de maiúsculas e minúsculas, o callback ainda os reporta como iguais. O resultado mantém o valor como aparece em $array1 (Cherry).
Exemplo 3: Por que a verificação de índice importa
A parte "assoc" é mais fácil de visualizar quando o mesmo valor está sob chaves diferentes:
<?php
$array1 = array('x' => 'red', 'y' => 'green', 'z' => 'blue');
$array2 = array('x' => 'red', 'w' => 'green', 'z' => 'BLUE');
$result = array_uintersect_assoc($array1, $array2, "strcasecmp");
print_r($result);
?>Saída:
Array
(
[x] => red
[z] => blue
)red corresponde porque compartilha a chave x em ambos os arrays. blue/BLUE corresponde porque compartilham a chave z e strcasecmp ignora a capitalização. Mas green é descartado: está sob a chave y no primeiro array e a chave w no segundo, então as chaves não se alinham. Se você usasse o simples array_uintersect() aqui, green seria incluído porque as chaves seriam ignoradas.
Funções relacionadas
array_intersect()— interseção por valor apenas, usando comparação de string.array_intersect_assoc()— interseção por chave e valor, usando comparação de string (sem callback).array_uintersect()— interseção por valor com um callback, ignorando chaves.array_uintersect_uassoc()— como esta função, mas as chaves também são comparadas com um segundo callback.
Conclusão
array_uintersect_assoc() mantém as entradas do primeiro array cuja chave aparece em todos os outros arrays e cujo valor o callback trata como igual em todos eles. Use-a quando as chaves são significativas e a correspondência de valores requer lógica personalizada. Se você também precisar controlar como as chaves são comparadas, use array_uintersect_uassoc(); se a comparação de valores por string for suficiente, o mais simples array_intersect_assoc() resolve o problema.