W3docs

sort()

Ordinare gli array in PHP è un'operazione fondamentale. Scopri sort(), asort(), ksort(), usort() e le loro varianti con esempi pratici.

Introduzione

L'ordinamento è una delle operazioni più comuni che si eseguono sugli array: ordinare un listino prezzi, mettere in ordine alfabetico dei nomi, classificare dei punteggi. PHP mette a disposizione un'intera famiglia di funzioni di ordinamento, e quella da scegliere dipende da due domande: ordinare per valore o per chiave? e è necessario mantenere le chiavi originali?

Questo capitolo spiega sort() e le sue funzioni correlate, mostra l'output di ciascuna e aiuta a scegliere la funzione giusta fin dalla prima volta.

Ordinamento degli array PHP

Le funzioni di ordinamento degli array in PHP modificano l'array in place (per riferimento) e restituiscono true in caso di successo o false in caso di fallimento — non restituiscono un nuovo array ordinato. Quindi si scrive sempre sort($arr);, mai $arr = sort($arr);.

Le funzioni seguono uno schema di denominazione prevedibile:

FunzioneOrdina perMantiene le associazioni chiave-valore?Ordine
sort()valoreNo (reindicizza da 0,1,2…)crescente
rsort()valoreNodecrescente
asort()valorecrescente
arsort()valoredecrescente
ksort()chiavecrescente
krsort()chiavedecrescente
usort()personalizzato (valore)Nopersonalizzato
uasort()personalizzato (valore)personalizzato
uksort()personalizzato (chiave)personalizzato

Lo schema è facile da leggere una volta capito: una a iniziale significa "mantieni le associazioni di chiave" (key Associations), una k significa "ordina per chiave" (Key), una r significa "inverso" (Reverse) e una u significa "confronto definito dall'utente" (User-defined).

sort()

La funzione sort() ordina un array in ordine crescente per valore. È la scelta giusta per gli array indicizzati semplici (di tipo lista) in cui le chiavi originali non sono importanti — e qui sta l'insidia: sort() elimina le chiavi esistenti e reindicizza da 0. Non usarla mai su un array associativo che si vuole mantenere intatto.

$numbers = [3, 1, 2];
sort($numbers);
print_r($numbers);

Output:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

Funziona anche con le stringhe, confrontandole in ordine alfabetico:

$fruits = ["banana", "apple", "cherry"];
sort($fruits);
print_r($fruits);
// Array ( [0] => apple [1] => banana [2] => cherry )

È possibile sovrascrivere la regola di confronto con il secondo argomento opzionale flags — ad esempio SORT_NUMERIC, SORT_STRING oppure SORT_NATURAL (che ordina "img10" dopo "img2" come farebbe un essere umano).

asort()

La funzione asort() ordina per valore in ordine crescente ma preserva l'associazione chiave-valore. Va usata quando le chiavi hanno un significato — come una mappa di nomi collegati a punteggi.

$scores = ['Alice' => 85, 'Bob' => 92, 'Charlie' => 78];
asort($scores);
print_r($scores);

Output (le righe sono riordinate, ma ogni nome mantiene il proprio punteggio):

Array
(
    [Charlie] => 78
    [Alice] => 85
    [Bob] => 92
)

A confronto, sort($scores) avrebbe sostituito Charlie/Alice/Bob con 0/1/2, perdendo completamente i nomi.

ksort()

La funzione ksort() ordina un array per le sue chiavi in ordine crescente, mantenendo ogni chiave abbinata al proprio valore. È utile quando le chiavi sono ID, date o etichette che si vuole avere in ordine.

$data = ['c' => 3, 'a' => 1, 'b' => 2];
ksort($data);
print_r($data);

Output:

Array
(
    [a] => 1
    [b] => 2
    [c] => 3
)

usort() e uasort()

Quando gli ordinamenti predefiniti non bastano — ad esempio per ordinare oggetti, per un campo annidato o per applicare regole di business — si può passare una funzione di confronto personalizzata. usort() ordina un array normale (reindicizzando le chiavi), mentre uasort() fa lo stesso ma preserva le chiavi.

La callback di confronto riceve due elementi e deve restituire un intero: negativo se il primo deve venire prima del secondo, positivo se dopo e zero se sono uguali. L'operatore spaceship <=> restituisce esattamente questo, quindi è la scelta idiomatica.

$people = [
    ['name' => 'Alice', 'age' => 30],
    ['name' => 'Bob',   'age' => 25],
    ['name' => 'Carol', 'age' => 35],
];

usort($people, function ($a, $b) {
    return $a['age'] <=> $b['age']; // sort by age, ascending
});

foreach ($people as $p) {
    echo $p['name'] . ": " . $p['age'] . "\n";
}

Output:

Bob: 25
Alice: 30
Carol: 35

Per ordinare in modo decrescente, è sufficiente invertire gli operandi: return $b['age'] <=> $a['age'];.

Ordine decrescente

Per un semplice ordinamento inverso, è preferibile usare le varianti con prefisso r anziché scrivere una callback personalizzata: rsort() (per valore, reindicizza), arsort() (per valore, mantiene le chiavi) e krsort() (per chiave, mantiene le chiavi).

$numbers = [3, 1, 2];
rsort($numbers);
print_r($numbers);
// Array ( [0] => 3 [1] => 2 [2] => 1 )

Per un ordinamento alfanumerico "human-friendly", si può usare natsort(), che ordina ["img12", "img2"] come img2, img12 anziché nell'ordine ASCII rigoroso img12, img2.

Applicazioni pratiche dell'ordinamento degli array PHP

L'ordinamento degli array in PHP ha numerose applicazioni pratiche, tra cui:

Ordinamento di array di prezzi di prodotti

Nella creazione di un sito di e-commerce, potrebbe essere necessario ordinare i prodotti in base al prezzo. Usando le funzioni di ordinamento degli array PHP, è possibile ordinare un array di prezzi in ordine crescente o decrescente, permettendo ai clienti di filtrare i prodotti per fascia di prezzo.

Ordinamento di array di record di database

Quando si recuperano dati da un database, potrebbe essere necessario ordinare i record in base a criteri specifici, come data, ora o ordine alfabetico. Usando le funzioni di ordinamento degli array PHP, è possibile ordinare i record del database dopo il recupero, facilitando l'analisi dei dati.

Ordinamento di array di input utente

Quando si raccolgono dati dall'input dell'utente, potrebbe essere necessario ordinarli in base a criteri specifici, come età o posizione geografica. Usando le funzioni di ordinamento degli array PHP, è possibile ordinare i dati in ordine crescente o decrescente, facilitandone la visualizzazione ad altri utenti.

Conclusione

Scegliere la funzione di ordinamento giusta si riduce a due domande: si ordina per valore o per chiave, e si devono mantenere le chiavi originali? Si usano sort()/rsort() per le liste semplici, asort()/arsort() e ksort()/krsort() quando le chiavi sono importanti, e usort()/uasort() quando servono regole personalizzate. Poiché tutte queste funzioni ordinano in place e restituiscono un booleano, è importante ricordare di chiamarle come istruzioni — senza assegnarne il risultato all'array.

Pratica

Pratica
Quali dei seguenti sono modi corretti per ordinare un array in PHP?
Quali dei seguenti sono modi corretti per ordinare un array in PHP?
Was this page helpful?