Comprendere la funzione PHP array_diff_key
La funzione PHP array_diff_key confronta array per chiave e restituisce le voci del primo array assenti negli altri. Semplice ma potente.
array_diff_key() confronta due o più array per le loro chiavi e restituisce le voci del primo array le cui chiavi non sono presenti in nessuno degli altri array. La parola chiave è chiavi: la funzione non esamina mai i valori. Questo la rende lo strumento giusto ogni volta che si desidera rimuovere o mantenere elementi di un array in base a un insieme di chiavi — ad esempio, eliminare campi indesiderati dall'input di un modulo o trovare quali opzioni di configurazione mancano in un override.
Questa pagina tratta la firma della funzione, un esempio eseguibile, come gestisce valori e chiavi numeriche, i casi d'uso reali più comuni e le differenze rispetto alle funzioni correlate per il confronto di array.
Sintassi
array_diff_key(array $array, array ...$arrays): array$array— l'array da confrontare (il risultato contiene solo le sue voci)....$arrays— uno o più array le cui chiavi vengono usate per escludere voci da$array.- Restituisce un nuovo array. Ogni voce di
$arrayviene mantenuta solo se la sua chiave non compare in nessuno degli altri array. Chiavi e valori sono preservati esattamente come erano in$array.
Come funziona array_diff_key
La funzione scorre le chiavi del primo array. Per ogni chiave, controlla tutti gli altri array; se la chiave viene trovata in uno qualsiasi di essi, quella voce viene eliminata. Sopravvivono solo le voci le cui chiavi sono univoche nel primo array.
Ecco un esempio pratico — confrontare un listino prezzi completo con gli articoli che hanno già uno sconto, per trovare quelli che ne hanno ancora bisogno:
Esempio PHP di utilizzo di array_diff_key
<?php
$prices = [
"apple" => 1.20,
"banana" => 0.50,
"cherry" => 3.00,
"date" => 2.10,
];
// Items that already have a discounted price.
$discounted = ["banana" => 0.40, "date" => 1.90];
// Keep only the items NOT present in $discounted (compared by key).
$result = array_diff_key($prices, $discounted);
print_r($result);
?>L'output mantiene apple e cherry perché le loro chiavi sono assenti da $discounted. Si noti che banana e date vengono rimossi anche se i loro valori differiscono tra i due array — array_diff_key() ignora completamente i valori:
Array
(
[apple] => 1.2
[cherry] => 3
)Confronto di più di due array
È possibile passare qualsiasi numero di array. Una voce viene rimossa se la sua chiave compare in uno qualsiasi di essi:
<?php
$a = ["color" => "red", "size" => "M", "qty" => 5];
$b = ["color" => "blue"];
$c = ["qty" => 99];
print_r(array_diff_key($a, $b, $c));
?>Rimane solo size, perché color è trovato in $b e qty è trovato in $c:
Array
(
[size] => M
)Le chiavi vengono confrontate come stringhe
PHP converte tutte le chiavi in stringhe prima di confrontarle, quindi la chiave intera 0 e la chiave stringa "0" vengono trattate come la stessa chiave. Questo è importante quando si mescolano chiavi numeriche e string:
<?php
$nums = [0 => "a", 1 => "b", 2 => "c"];
$remove = ["0" => "x", "2" => "y"];
print_r(array_diff_key($nums, $remove));
?>Array
(
[1] => b
)Casi d'uso di array_diff_key
- Whitelist/blacklist di campi. Rimuovere le chiavi indesiderate dall'input dell'utente:
array_diff_key($input, array_flip(['password', 'token']))elimina quelle due chiavi indipendentemente dai loro valori. - Trovare configurazioni mancanti. Confrontare un insieme di valori predefiniti con una configurazione fornita dall'utente per vedere quali chiavi sono state omesse.
- Riconciliare dataset. Identificare record (indicizzati per ID) presenti in un array ma non in un altro.
- Pulire i dati di una richiesta prima di passarli a una funzione che rifiuta chiavi inattese.
Suggerimento: Se invece si vuole mantenere solo le voci le cui chiavi compaiono in un altro array, usare
array_intersect_key()— è l'immagine speculare diarray_diff_key().
array_diff_key vs. funzioni correlate
| Funzione | Confronta per | Valori considerati? |
|---|---|---|
array_diff_key() | solo chiavi | no |
array_diff() | solo valori | sì |
array_diff_assoc() | chiavi e valori | sì |
array_diff_ukey() | chiavi tramite callback | no |
Se è necessario un ulteriore controllo dei valori oltre al confronto delle chiavi, utilizzare array_diff_assoc(). Per personalizzare il modo in cui le chiavi vengono confrontate (ad esempio, confronto senza distinzione tra maiuscole e minuscole), usare array_diff_ukey().
Conclusione
array_diff_key() è un modo mirato e veloce per filtrare un array rispetto alle chiavi degli altri. Ricordare le due regole che creano confusione: confronta solo le chiavi (i valori vengono ignorati) e le chiavi vengono convertite in stringhe prima del confronto. Per confronti che tengono conto dei valori, vedere array_diff_assoc(); per verificare una singola chiave usare array_key_exists().