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 callbackfn(mixed $a, mixed $b): intche restituisce0quando due chiavi sono considerate uguali, e un intero negativo/positivo negli altri casi (lo stesso contratto<=>usato dausort). Funzioni built-in comestrcasecmprispettano 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:
- Il valore non corrisponde (i valori vengono confrontati con la normale uguaglianza
==dopo la conversione a string — la stessa regola usata daarray_diff()), oppure - La chiave non corrisponde secondo la
$key_compare_funcfornita.
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
Output:
Array
(
[Banana] => 0.5
[Cherry] => 3
)Analisi di ogni elemento di $prices:
Apple => 1.20—strcasecmp("Apple", "apple")è0, quindi le chiavi corrispondono, e anche il valore1.20corrisponde a$updated["apple"]. Entrambi corrispondono, quindi viene eliminato.Banana => 0.50— le chiavi corrispondono (strcasecmp("Banana", "banana") === 0), ma i valori differiscono (0.50vs0.75). Poiché il valore non corrisponde, l'elemento viene mantenuto.Cherry => 3.00— nessuna chiave in$updatedcorrisponde, 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:
array_diff()— confronta solo i valori; le chiavi vengono ignorate.array_diff_assoc()— confronta chiavi e valori con le regole built-in (senza callback).array_diff_key()— confronta solo le chiavi, con confronto built-in.array_diff_ukey()— confronta solo le chiavi, ma con una callback per le chiavi.array_udiff()— confronta i valori con una callback; le chiavi vengono ignorate.array_udiff_assoc()— callback per i valori, controllo built-in sulle chiavi.array_udiff_uassoc()— callback sia per i valori che per le chiavi.
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.