uasort()
Scopri come ordinare array associativi PHP per valore con una funzione di confronto personalizzata usando uasort(), mantenendo le chiavi originali.
Ordinare array in PHP con uasort()
La funzione PHP uasort() ordina un array associativo per i suoi valori usando una funzione di confronto che scrivi tu stesso, mantenendo ogni valore associato alla propria chiave originale. La "u" sta per user-defined (fornisci tu la logica di confronto) e la "a" sta per associative (le coppie chiave/valore vengono preservate).
Questa pagina spiega cosa fa uasort(), la sua sintassi, come scrivere una corretta funzione di confronto ed esempi pratici per array semplici, associativi e multidimensionali — ogni risultato mostrato è l'output reale dell'esecuzione del codice.
Cosa fa uasort() e quando usarla
La maggior parte delle funzioni di ordinamento di PHP ignora le chiavi o permette solo l'ordinamento con le regole di confronto predefinite. uasort() ti offre entrambe le cose contemporaneamente:
- Controlli l'ordine. Passi una callback che decide quale di due valori viene prima, così puoi ordinare per lunghezza, per un campo nidificato, in ordine inverso, per una lista di priorità personalizzata — qualsiasi cosa tu possa esprimere in codice.
- Le chiavi rimangono associate ai loro valori. Dopo l'ordinamento,
$array["John"]punta ancora al valore di John; cambia solo l'ordine in cui le coppie vengono iterate.
Usa uasort() quando entrambe queste condizioni sono vere: hai bisogno di una regola personalizzata e le chiavi sono significative (un nome, un ID, uno slug). Se le chiavi sono semplici posizioni 0, 1, 2… usa usort(), che reindicizza automaticamente. Se vuoi ordinare per chiavi invece che per valori, usa uksort(). Se hai bisogno solo di un semplice ordinamento crescente/decrescente per valori senza regole personalizzate, asort() e arsort() lo fanno senza callback.
Sintassi
uasort(array &$array, callable $callback): boolarray &$array— l'array da ordinare. Il simbolo&significa che viene passato per riferimento:uasort()ordina l'array in loco e restituiscetrue/false, non restituisce un nuovo array ordinato.callable $callback— la tua funzione di confronto. Riceve due valori,$ae$b, e deve restituire un intero che indica a PHP il loro ordine relativo.- Valore di ritorno —
bool, sempretrue(restituisce un valore per poter essere usata in espressioni, ma normalmente viene chiamata per il suo effetto collaterale su$array).
Poiché l'array viene modificato in loco, scrivi
uasort($array, ...);su una riga a sé — non scrivere$array = uasort($array, ...), che sovrascriverà i tuoi dati contrue.
Scrivere la funzione di confronto
La callback confronta due valori e restituisce un intero:
- un numero negativo se
$adeve venire prima di$b, 0se il loro ordine non ha importanza (sono considerati uguali),- un numero positivo se
$adeve venire dopo$b.
Il modo più pulito per produrre questo risultato è l'operatore spaceship <=>, che restituisce esattamente -1, 0 o 1:
// ascending
fn($a, $b) => $a <=> $b;
// descending — just flip the operands
fn($a, $b) => $b <=> $a;Lo stile più vecchio ($a < $b) ? -1 : 1 funziona anch'esso, ma non restituisce mai 0, quindi gli elementi uguali ottengono un ordine arbitrario. Preferisci <=>; è più breve, corretto per il caso di uguaglianza e funziona per numeri, stringhe e array.
Esempio 1: Ordinare i valori di un array indicizzato (chiavi preservate)
Qui uasort() ordina i numeri in modo crescente, ma nota come le chiavi originali viaggiano con i valori — questa è la differenza rispetto a sort(), che li rinumererebbe 0…9.
Output:
Array
(
[1] => 1
[3] => 1
[6] => 2
[0] => 3
[9] => 3
[2] => 4
[4] => 5
[8] => 5
[7] => 6
[5] => 9
)Esempio 2: Ordinare un array associativo per valore
Questo è l'uso più comune: ordinare le persone per età mantenendo i loro nomi come chiavi.
Output:
Array
(
[Mary] => 28
[Jane] => 28
[John] => 32
[David] => 37
[Bob] => 45
)Per ordinare dal più vecchio al più giovane, inverti gli operandi: fn($a, $b) => $b <=> $a.
Esempio 3: Ordinare un array multidimensionale per un campo nidificato
Quando ogni elemento è a sua volta un array, la callback riceve l'intero sotto-array, quindi lo si indicizza per scegliere il campo su cui ordinare. Qui ordiniamo per età ([1]).
Output:
Array
(
[1] => Array
(
[0] => Mary
[1] => 28
)
[3] => Array
(
[0] => Jane
[1] => 28
)
[0] => Array
(
[0] => John
[1] => 32
)
[4] => Array
(
[0] => David
[1] => 37
)
[2] => Array
(
[0] => Bob
[1] => 45
)
)Per righe con chiavi in un campo associativo, sostituisci $a[1] con qualcosa come $a['age'].
uasort() vs usort()
Le funzioni sono identiche tranne per le chiavi. Esegui gli stessi dati con entrambe:
<?php
$ages = ["John" => 32, "Mary" => 28, "Bob" => 45];
$copy = $ages;
usort($copy, fn($a, $b) => $a <=> $b);
echo "usort (keys lost):\n";
print_r($copy);
uasort($ages, fn($a, $b) => $a <=> $b);
echo "uasort (keys kept):\n";
print_r($ages);Output:
usort (keys lost):
Array
(
[0] => 28
[1] => 32
[2] => 45
)
uasort (keys kept):
Array
(
[Mary] => 28
[John] => 32
[Bob] => 45
)Errori comuni
- Restituisce
true, non l'array. Leggi il risultato ordinato dalla variabile che hai passato, non dal valore di ritorno. - L'ordinamento non è stabile prima di PHP 8.0. Se due valori sono uguali, il loro ordine relativo era definito dall'implementazione nelle versioni precedenti. Da PHP 8.0 in poi, tutte le funzioni di ordinamento (inclusa
uasort()) sono stabili, quindi gli elementi uguali mantengono il loro ordine originale. - Gestisci sempre il caso di uguaglianza. Restituire
1per "non minore di" (invece di0) può mescolare elementi uguali su PHP vecchio ed è semplicemente scorretto;<=>lo gestisce automaticamente.
Funzioni correlate
usort()— stesso ordinamento con regola personalizzata, ma reindicizza le chiavi.uksort()— ordina per chiavi con una callback personalizzata.asort()/arsort()— ordinamento per valore, crescente/decrescente, senza callback.ksort()— ordina per chiavi senza callback.- Ordinare array in PHP — panoramica di tutte le funzioni di ordinamento e quando usare ciascuna.
Conclusione
uasort() è lo strumento per ordinare un array associativo per valore con la propria regola di confronto mantenendo le chiavi intatte. Abbinala all'operatore spaceship per callback pulite e corrette, ricorda che ordina in loco e sceglila rispetto a usort() ogni volta che le chiavi hanno un significato.