Menu

Ordinare array in PHP: sort(), usort(), asort() e ksort()

sort($array) ordina una lista sul posto, asort e ksort ordinano un array associativo per valore o per chiave, e usort ordina con un tuo confronto. Impara tutte queste funzioni, ordina un array multidimensionale per colonna ed evita il classico errore $sorted = sort($arr).

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

sort($array) ordina un array in ordine crescente, sul posto. Modifica la variabile che passi e restituisce true, quindi la chiami su una riga a sé e poi usi l'array. rsort() ordina in ordine decrescente.

PHP ha una funzione di ordinamento per ogni combinazione di "per valore o per chiave", "crescente o decrescente" e "mantenere le chiavi o no":

FunzioneOrdina perOrdineChiavi
sortvalorecrescenterinumerate 0, 1, 2
rsortvaloredecrescenterinumerate
asortvalorecrescentemantenute
arsortvaloredecrescentemantenute
ksortchiavecrescentemantenute
krsortchiavedecrescentemantenute
usortla tua funzionea tua sceltarinumerate
uasortla tua funzionea tua sceltamantenute
uksortla tua funzione sulle chiavia tua sceltamantenute

Ordinare un array associativo per valore

sort() su un array associativo butta via le chiavi. Usa asort() per ordinare per valore tenendo ogni chiave con il suo valore, oppure arsort() per mettere prima i più alti.

Ordinare un array per chiave con ksort

ksort() ordina per chiave, krsort() per chiave al contrario. È comodo prima di stampare delle impostazioni o di costruire una query string in un ordine stabile.

Ordine personalizzato con usort e l'operatore spaceship

usort($array, $callback) ti fa decidere l'ordine. La callback riceve due elementi e restituisce un numero negativo se il primo deve venire prima, un numero positivo se deve venire prima il secondo, e 0 se sono uguali. L'operatore spaceship <=> restituisce esattamente questo.

banana e cherry hanno la stessa lunghezza, quindi la callback restituisce 0 per loro e restano nell'ordine che avevano già. L'ordinamento di PHP è stabile da PHP 8.0: gli elementi uguali mantengono il loro ordine precedente.

Ordinare un array multidimensionale per un valore

Per ordinare una lista di righe per un campo, confronta quel campo in usort. Per ordinare per due campi, confronta degli array: <=> li confronta elemento per elemento, quindi il secondo campo decide solo a parità del primo.

Il secondo confronto mette $b["age"] a sinistra e $a["age"] a destra, il che inverte solo l'ordine per età. array_multisort(array_column($people, 'city'), SORT_ASC, array_column($people, 'age'), SORT_DESC, $people) dà lo stesso ordine senza callback: ordina per le colonne estratte e riordina $people di conseguenza.

Ordine naturale e flag di ordinamento

Di default PHP confronta i numeri come numeri e le stringhe come stringhe. I nomi di file con numeri si ordinano in un modo che le persone non si aspettano: img10 viene prima di img2, e ogni nome maiuscolo viene prima di ogni nome minuscolo. I flag cambiano il modo in cui i valori vengono confrontati.

SORT_NATURAL legge le sequenze di cifre come numeri, SORT_FLAG_CASE ignora maiuscole e minuscole e SORT_STRING forza un confronto carattere per carattere anche per le stringhe numeriche. natsort() e natcasesort() seguono la stessa idea ma mantengono le chiavi.

Errore comune: assegnare il risultato di sort

Ogni funzione di ordinamento restituisce true e modifica l'array che le passi. Assegnare il valore restituito fa perdere l'array:

Se ti serve una copia ordinata e vuoi mantenere l'originale, copia prima l'array in una nuova variabile e ordina la copia, come fa l'esempio con asort qui sopra con $copy.

Domande frequenti

Perché sort() restituisce true invece dell'array ordinato?

Le funzioni di ordinamento di PHP ordinano l'array sul posto, tramite un riferimento, e restituiscono true. Chiama sort($arr); su una riga a sé e usa $arr dopo. Scrivere $arr = sort($arr); sostituisce il tuo array con true.

Come ordino un array associativo per valore mantenendo le chiavi?

Usa asort($arr) per l'ordine crescente o arsort($arr) per quello decrescente. Anche sort() e rsort() ordinano per valore ma buttano via le chiavi e rinumerano da 0.

Come ordino un array multidimensionale per un valore in PHP?

Usa usort con l'operatore spaceship sul campo: usort($rows, fn($a, $b) => $a['age'] <=> $b['age']);. Scambia $a e $b per l'ordine decrescente, e confronta array come [$a['city'], $a['age']] <=> [$b['city'], $b['age']] per ordinare per due campi.

L'ordinamento di PHP è stabile?

Sì, da PHP 8.0 ogni funzione di ordinamento è stabile: gli elementi considerati uguali mantengono l'ordine che avevano prima. È ciò che fa funzionare come previsto l'ordinamento per un campo e poi per un altro.

Come ordino stringhe con numeri in ordine naturale?

Usa natsort($arr) o sort($arr, SORT_NATURAL), che mettono img2 prima di img10. Aggiungi SORT_FLAG_CASE (SORT_NATURAL | SORT_FLAG_CASE) oppure usa natcasesort per ignorare maiuscole e minuscole.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA