W3docs

Comprendere la funzione array_diff_uassoc di PHP

Scopri come funziona array_diff_uassoc in PHP: confronta array con controllo delle chiavi e funzione di confronto personalizzata.

array_diff_uassoc() confronta due (o più) array con un controllo aggiuntivo sulla chiave, e permette di fornire una propria funzione per confrontare le chiavi. Restituisce ogni elemento del primo array la cui coppia chiave/valore non trova corrispondenza in nessuno degli altri array. Questa pagina illustra la firma della funzione, spiega esattamente come funziona il confronto e indica quando usarla al posto delle funzioni di differenza tra array più semplici.

La "u" nel nome sta per user-supplied (fornita dall'utente) per il confronto delle chiavi; "assoc" indica che anche le chiavi vengono verificate (confronto associativo).

Firma

array_diff_uassoc(
    array $array,
    array ...$arrays,
    callable $key_compare_func
): array
  • $array — l'array da cui eseguire il confronto. I suoi elementi compaiono nel risultato.
  • $arrays — uno o più array con cui confrontare.
  • $key_compare_func — una callback fn(mixed $a, mixed $b): int che restituisce 0 quando due chiavi sono considerate uguali, e un intero negativo/positivo negli altri casi (lo stesso contratto <=> usato da usort). Funzioni built-in come strcasecmp rispettano questa firma.

Restituisce un nuovo array; gli array originali non vengono modificati.

Come funziona il confronto

Questo è il punto che crea più confusione. array_diff_uassoc() mantiene un elemento di $array solo se entrambe queste condizioni sono vere rispetto agli altri array:

  1. Il valore non corrisponde (i valori vengono confrontati con la normale uguaglianza == dopo la conversione a string — la stessa regola usata da array_diff()), oppure
  2. La chiave non corrisponde secondo la $key_compare_func fornita.

In altre parole: un elemento viene eliminato solo quando un altro array contiene lo stesso valore sotto una chiave che la callback considera uguale. Quindi la callback personalizzata governa le chiavi; i valori vengono ancora confrontati con la regola built-in di PHP. Quest'ultimo punto è il malinteso più comune — la callback riguarda solo le chiavi.

Esempio

Confronto di listini prezzi con chiavi case-insensitive

php— editable, runs on the server

Output:

Array
(
    [Banana] => 0.5
    [Cherry] => 3
)

Analisi di ogni elemento di $prices:

  • Apple => 1.20strcasecmp("Apple", "apple") è 0, quindi le chiavi corrispondono, e anche il valore 1.20 corrisponde a $updated["apple"]. Entrambi corrispondono, quindi viene eliminato.
  • Banana => 0.50 — le chiavi corrispondono (strcasecmp("Banana", "banana") === 0), ma i valori differiscono (0.50 vs 0.75). Poiché il valore non corrisponde, l'elemento viene mantenuto.
  • Cherry => 3.00 — nessuna chiave in $updated corrisponde, quindi viene mantenuto.

Questo illustra la regola in azione: una chiave corrispondente da sola non è sufficiente a rimuovere un elemento — deve corrispondere anche il valore.

Funzioni diff correlate

array_diff_uassoc() fa parte di una famiglia di funzioni per la differenza tra array. Scegli quella la cui strategia di confronto si adatta ai tuoi dati:

Quando usarla?

Usa array_diff_uassoc() quando le chiavi sono rilevanti per il confronto ma la corrispondenza predefinita delle chiavi è troppo rigida — ad esempio quando le chiavi differiscono solo per maiuscole/minuscole o formattazione, oppure quando le chiavi sono oggetti/valori che richiedono una logica personalizzata per essere considerati "uguali". Se ti interessano solo i valori, usa array_udiff(); se hai bisogno di una callback anche per i valori, usa array_udiff_uassoc().

Conclusione

array_diff_uassoc() restituisce gli elementi del primo array che non trovano corrispondenza di chiave/valore negli altri array, usando una callback da te fornita per decidere quando due chiavi sono uguali. Ricorda che i valori vengono ancora confrontati con la regola built-in di PHP — un elemento sopravvive a meno che sia la sua chiave che il suo valore trovino corrispondenza altrove.

Esercizio

Pratica
Cosa puoi affermare sulla funzione PHP array_diff_uassoc() in base alle informazioni fornite nell'articolo?
Cosa puoi affermare sulla funzione PHP array_diff_uassoc() in base alle informazioni fornite nell'articolo?
Was this page helpful?