W3docs

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

php— editable, runs on the server

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

Esercitazione

Pratica
Cosa fa la funzione array_diff_assoc() in PHP?
Cosa fa la funzione array_diff_assoc() in PHP?
Was this page helpful?