Funzione PHP array_diff_assoc
La funzione PHP array_diff_assoc confronta due o più array e restituisce le differenze basandosi sia sulle chiavi che sui valori.
La funzione PHP array_diff_assoc() confronta due o più array e restituisce le voci del primo array che mancano in tutti gli altri. A differenza di array_diff(), che esamina solo i valori, array_diff_assoc() controlla sia la chiave che il valore — quindi una coppia sopravvive al confronto solo quando nessun altro array ha quella chiave esatta abbinata a quel valore esatto. Questo la rende lo strumento giusto per confrontare gli array associativi.
Questa pagina tratta la sintassi, come funziona la corrispondenza chiave + valore, la differenza rispetto a array_diff(), il problema del confronto loose (come stringhe) e un esempio con più array.
Sintassi
array_diff_assoc(array $array, array ...$arrays): array$array— l'array da cui confrontare. Le voci sopravvissute formano il risultato....$arrays— uno o più array con cui confrontare.
La funzione restituisce un nuovo array contenente ogni coppia chiave/valore di $array che non appare (con la stessa chiave) in nessuno degli altri array. Le chiavi vengono preservate nel risultato.
Come funziona
array_diff_assoc() percorre il primo array e, per ogni coppia, chiede: qualche altro array contiene questa stessa chiave con questo stesso valore? Se sì, la coppia viene eliminata; se no, viene mantenuta.
Esempio di array_diff_assoc() in PHP
Output:
Array
(
[b] => banana
)Solo "b" => "banana" sopravvive: $array2 non ha affatto la chiave b. Le coppie a e c corrispondono per chiave e valore, quindi vengono rimosse. Si noti che "d" => "date" in $array2 è irrilevante — solo le voci del primo array possono apparire nel risultato.
array_diff_assoc() vs array_diff()
La differenza principale è se le chiavi fanno parte del confronto. Con lo stesso valore sotto chiavi diverse, array_diff() le considera uguali, ma array_diff_assoc() no:
<?php
$a = array("a" => "apple", "b" => "banana");
$b = array("x" => "apple");
print_r(array_diff_assoc($a, $b)); // compares key AND value
print_r(array_diff($a, $b)); // compares value only
?>Output:
Array
(
[a] => apple
[b] => banana
)
Array
(
[b] => banana
)array_diff_assoc() mantiene "a" => "apple" perché $b memorizza apple sotto la chiave x, non a. array_diff() la elimina perché il valore apple esiste da qualche parte in $b.
Attenzione: il confronto avviene come stringhe
Internamente array_diff_assoc() confronta i valori in modo loose convertendoli in stringhe — (string) $elem1 === (string) $elem2. Ciò significa che 10 (int) e "10" (string) sono considerati uguali:
<?php
$a = array("x" => 10);
$b = array("x" => "10");
print_r(array_diff_assoc($a, $b));
?>Output:
Array
(
)Il risultato è vuoto: 10 e "10" diventano entrambi la stringa "10". Se si ha bisogno di un confronto rigoroso dei tipi, si utilizzi una callback con array_udiff_assoc() (o si confrontino i tipi manualmente). Per confrontare solo le chiavi, si utilizzi array_diff_key().
Confronto con più di due array
È possibile passare qualsiasi numero di array. Una voce deve essere assente da tutti per sopravvivere. Funziona anche con chiavi numeriche:
<?php
$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "green", "yellow", "red");
print_r(array_diff_assoc($array1, $array2));
?>Output:
Array
(
[b] => brown
[c] => blue
[0] => red
)"a" => "green" corrisponde e viene rimossa. [0] => "red" sopravvive perché in $array2 il valore "red" si trova alla chiave 1, non 0 — quindi la coppia chiave/valore è diversa.
Quando utilizzarla
- Per confrontare due array di configurazione o impostazioni dove la chiave è importante (ad esempio, per individuare le opzioni modificate).
- Per trovare le voci rimosse da uno snapshot "prima" quando sono rilevanti sia la chiave che il valore.
- In qualsiasi confronto in cui la corrispondenza solo per valore (
array_diff()) darebbe falsi positivi.
Funzioni correlate
array_diff()— confronta solo per valore.array_diff_key()— confronta solo per chiave.array_intersect_assoc()— l'inverso: mantiene le voci presenti in tutti gli array per chiave e valore.