La funzione array_intersect_ukey() in PHP
Scopri come usare array_intersect_ukey() in PHP per confrontare le chiavi di più array con una funzione di callback personalizzata.
La funzione array_intersect_ukey() confronta le chiavi di due o più array usando una callback fornita dall'utente e restituisce le voci del primo array le cui chiavi sono presenti in tutti gli altri array. La u nel nome sta per confronto fornito dall'utente — è la variante basata sulle chiavi di array_intersect_key(), con la differenza che sei tu a decidere quando due chiavi sono considerate "uguali".
Questa pagina spiega cosa restituisce la funzione, come la callback di confronto influenza il risultato e le insidie da conoscere prima di utilizzarla.
Quando usarla?
Usa array_intersect_ukey() quando hai bisogno di mantenere solo le voci le cui chiavi si sovrappongono, ma la semplice uguaglianza delle chiavi non è sufficiente. Casi tipici:
- Corrispondenza delle chiavi senza distinzione maiuscole/minuscole — tratta
Hostehostcome la stessa chiave. - Chiavi normalizzate — ignora spazi bianchi, prefissi o differenze di formattazione prima del confronto.
- Filtrare un array di configurazione o di richiesta limitandolo alle chiavi presenti anche in una lista bianca di chiavi consentite.
Se hai bisogno solo di una corrispondenza esatta delle chiavi, usa il più semplice built-in array_intersect_key() — non è richiesta alcuna callback.
Sintassi
array_intersect_ukey(
array $array1,
array $array2,
array ...$arrays,
callable $key_compare_func
): arrayParametri e valore restituito
| Parametro | Descrizione |
|---|---|
$array1 | L'array da confrontare. I suoi valori sono quelli che finiscono nel risultato. |
$array2, ...$arrays | Uno o più array con cui confrontare le chiavi. |
$key_compare_func | L'ultimo argomento: una callback che accetta due chiavi. Deve restituire un intero minore di, uguale a, o maggiore di 0 quando la prima chiave è considerata rispettivamente minore di, uguale a, o maggiore della seconda. |
Restituisce: Un array contenente ogni coppia chiave-valore da $array1 la cui chiave corrisponde a una chiave in tutti gli altri array. Una chiave corrisponde quando la callback restituisce 0.
Nota: i valori provengono solo da
$array1. I valori memorizzati nelle chiavi corrispondenti negli altri array vengono ignorati — contano solo le loro chiavi.
Esempio base
<?php
function key_compare_func($key1, $key2)
{
if ($key1 == $key2)
return 0;
else if ($key1 > $key2)
return 1;
else
return -1;
}
$array1 = ['a' => 'green', 'b' => 'brown', 'c' => 'blue', 'red' => 3];
$array2 = ['d' => 'green', 'b' => 'yellow', 'yellow' => 10, 'red' => 'game'];
$result = array_intersect_ukey($array1, $array2, 'key_compare_func');
print_r($result);
?>Output:
Array
(
[b] => brown
[red] => 3
)La callback confronta le chiavi come fa l'operatore spaceship: restituisce 0 solo quando due chiavi sono uguali. Le chiavi b e red esistono in entrambi gli array, quindi le loro voci vengono mantenute — con i valori di $array1 (brown e 3), non di $array2.
In PHP moderno puoi sostituire l'intera funzione helper con l'operatore spaceship (<=>):
<?php
$array1 = ['a' => 'green', 'b' => 'brown', 'c' => 'blue', 'red' => 3];
$array2 = ['d' => 'green', 'b' => 'yellow', 'red' => 'game'];
$result = array_intersect_ukey(
$array1,
$array2,
fn($k1, $k2) => $k1 <=> $k2
);
print_r($result);
?>Output:
Array
(
[b] => brown
[red] => 3
)Corrispondenza delle chiavi senza distinzione maiuscole/minuscole
È qui che la callback si rivela utile. strcasecmp() restituisce già l'intero richiesto dalla funzione (0 quando uguale, ignorando le maiuscole), quindi puoi passarla direttamente per trovare corrispondenze nelle chiavi indipendentemente dalla capitalizzazione:
<?php
$config = ['Host' => 'localhost', 'PORT' => 8080, 'Debug' => true];
$defaults = ['host' => '0.0.0.0', 'port' => 80, 'timeout' => 30];
$shared = array_intersect_ukey($config, $defaults, 'strcasecmp');
print_r($shared);
?>Output:
Array
(
[Host] => localhost
[PORT] => 8080
)Host corrisponde a host e PORT corrisponde a port anche se la loro capitalizzazione è diversa, quindi entrambi sopravvivono. Debug non ha un corrispondente in $defaults, quindi viene eliminato. Si noti che le chiavi e i valori mantenuti sono esattamente come scritti nel primo array.
Insidie
- La callback deve restituire
0per una corrispondenza. Un errore comune è scrivere una callback che restituisce un boolean ($k1 === $k2).true/falsevengono convertiti in1/0, quindi chiavi non uguali potrebbero accidentalmente "corrispondere". Restituisci sempre un intero a tre valori. - I valori provengono solo dal primo array. Se due array condividono una chiave ma contengono valori diversi, il risultato conserva il valore del primo array.
- La callback è l'ultimo argomento, anche quando si passano tre o più array da confrontare.
- Per confrontare sia le chiavi che i valori, vedi
array_intersect_uassoc(); per l'operazione opposta (chiavi che non sono condivise), vediarray_diff_ukey().
Conclusione
array_intersect_ukey() filtra un array limitandolo alle voci le cui chiavi sono presenti anche in tutti gli altri array, usando la tua definizione di uguaglianza delle chiavi. Usala per la corrispondenza di chiavi senza distinzione maiuscole/minuscole o con chiavi normalizzate; ricadi su array_intersect_key() quando la corrispondenza esatta è sufficiente. La regola fondamentale da ricordare: la callback deve restituire 0 per chiavi uguali, e i valori risultanti provengono sempre dal primo array.