Capire la funzione PHP array_intersect_uassoc
Scopri come funziona array_intersect_uassoc() in PHP: intersezione di array con confronto delle chiavi tramite callback personalizzata.
array_intersect_uassoc() calcola l'intersezione di due o più array — restituisce le voci del primo array il cui valore E chiave compaiono anche in tutti gli altri array. La particolarità di questa variante è la u nel nome: si fornisce una callback definita dall'utente che stabilisce quando due chiavi sono considerate uguali. I valori vengono ancora confrontati con il confronto integrato di PHP (lasso, con cast a string).
Questa pagina spiega come funziona la funzione, mostra un esempio verificato e indica quando usarla al posto delle altre varianti array_intersect_*.
Sintassi
array_intersect_uassoc(
array $array,
array ...$arrays,
callable $key_compare_func
): array$array— l'array da confrontare; le sue voci compaiono nel risultato....$arrays— uno o più array da confrontare con il primo.$key_compare_func— una callback che confronta due chiavi. Deve restituire un intero minore, uguale o maggiore di0quando la prima chiave è considerata minore, uguale o maggiore della seconda (lo stesso contratto di un comparatoreusort).
La funzione restituisce un nuovo array contenente le voci corrispondenti di $array, preservandone le chiavi originali.
Come funziona la callback delle chiavi
A differenza di array_intersect_assoc(), che confronta le chiavi con ===, questa funzione delega il confronto delle chiavi alla propria callback. Ciò consente di implementare regole di corrispondenza che PHP non offre nativamente — chiavi case-insensitive, chiavi trimmate o ordinamento in base alla localizzazione.
Si noti la divisione delle responsabilità: le chiavi vengono confrontate dalla propria callback, ma i valori vengono ancora confrontati dalla funzione stessa (in modo lasso, come stringhe). Se si ha bisogno anche di un confronto personalizzato dei valori, usare array_uintersect_uassoc().
Esempio
<?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);
?>Output:
Array
(
[a] => green
)Solo "a" => "green" sopravvive, perché è l'unica voce la cui chiave e valore compaiono entrambi in $array2:
"b" => "brown"e"c" => "blue"— le chiavi non esistono in$array2.0 => "red"in$array1— il valore"red"esiste in$array2, ma alla chiave1, quindi le chiavi (0vs1) non corrispondono.
Quando usarla
Usa array_intersect_uassoc() quando hai bisogno di un'intersezione che tenga conto delle chiavi e le chiavi richiedono una logica di corrispondenza personalizzata. Un caso comune è la corrispondenza case-insensitive di intestazioni o colonne:
<?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"));
?>Questo mantiene Host => localhost e Port => 8080 perché la callback tratta Host/host e Port/PORT come la stessa chiave, mentre i valori corrispondono ancora.
Funzioni correlate
| Funzione | Confronto chiavi | Confronto valori |
|---|---|---|
array_intersect() | ignorato | integrato |
array_intersect_assoc() | === | integrato |
array_intersect_key() | === (solo chiavi) | ignorato |
array_intersect_ukey() | callback (solo chiavi) | ignorato |
array_intersect_uassoc() | callback | integrato |
array_uintersect_uassoc() | callback | callback |
Conclusione
array_intersect_uassoc() restituisce le voci del primo array il cui valore e chiave compaiono in tutti gli altri array, permettendo di controllare la corrispondenza delle chiavi tramite una callback definita dall'utente. Usala quando un'intersezione associativa necessita di regole di chiave flessibili — come chiavi case-insensitive o trimmate — e ricorda che i valori vengono ancora confrontati con il confronto integrato di PHP.