Ordinamento degli Array
Scopri le funzioni di ordinamento degli array in PHP: sort, rsort, asort, arsort, ksort, krsort e usort con esempi pratici.
Introduzione all'ordinamento degli array in PHP
Un array in PHP è una raccolta di elementi memorizzati e accessibili tramite un indice (una posizione numerica) o una chiave (un'etichetta). Ordinare significa ridisporre quegli elementi in un ordine definito — crescente, decrescente, per valore, per chiave, oppure secondo una regola personalizzata.
Questa pagina illustra le funzioni di ordinamento integrate in PHP, il comportamento di ciascuna e — altrettanto importante — quale scegliere a seconda che si voglia lavorare con le chiavi, i valori o un ordine personalizzato.
Come differiscono le funzioni di ordinamento
Due domande determinano quale funzione utilizzare:
- Ordinare per valore o per chiave? Le liste semplici (array indicizzati) si ordinano per valore; gli array associativi possono essere ordinati in entrambi i modi.
- Mantenere l'associazione chiave→valore?
sort()/rsort()scartano le chiavi originali e reindicizzano da0. La famigliaa*ek*preserva l'associazione.
| Funzione | Ordina per | Ordine | Mantiene le chiavi? |
|---|---|---|---|
sort() | valore | crescente | no (reindicizzato) |
rsort() | valore | decrescente | no (reindicizzato) |
asort() | valore | crescente | sì |
arsort() | valore | decrescente | sì |
ksort() | chiave | crescente | sì |
krsort() | chiave | decrescente | sì |
usort() | valore (personalizzato) | regola personalizzata | no (reindicizzato) |
uasort() | valore (personalizzato) | regola personalizzata | sì |
uksort() | chiave (personalizzata) | regola personalizzata | sì |
Ognuna di queste funzioni ordina l'array sul posto (modifica la variabile passata) e restituisce true in caso di successo anziché un nuovo array — un punto di confusione comune per i principianti.
Ordinamento degli array in ordine crescente
La funzione sort() ordina un array in ordine crescente: le stringhe alfabeticamente, i numeri numericamente. Modifica l'array originale sul posto e lo reindicizza da 0, quindi le chiavi originali vengono perse. Evitare di mescolare tipi di dati in un unico array, poiché i confronti tra stringhe e numeri, ad esempio, possono produrre risultati inaspettati.
$fruits = ['lemon', 'orange', 'banana', 'apple'];
sort($fruits);
print_r($fruits);
// Output: Array ( [0] => apple [1] => banana [2] => lemon [3] => orange )Ordinamento degli array in ordine decrescente
La funzione rsort() è l'inverso di sort() — ordina gli elementi dal più alto al più basso. Come sort(), opera sul posto e reindicizza l'array.
$numbers = [5, 2, 9, 1, 7];
rsort($numbers);
print_r($numbers);
// Output: Array ( [0] => 9 [1] => 7 [2] => 5 [3] => 2 [4] => 1 )Ordinamento degli array associativi per valore
Quando le chiavi hanno un significato (nomi, ID, etichette), utilizzare le funzioni a* in modo che le coppie chiave→valore rimangano unite. La funzione asort() ordina per valore in ordine crescente; arsort() fa lo stesso in ordine decrescente.
$ages = ['Peter' => 35, 'John' => 28, 'Mary' => 32];
asort($ages);
print_r($ages);
// Output: Array ( [John] => 28 [Mary] => 32 [Peter] => 35 )Si noti che ogni nome rimane associato alla propria età — questa è la differenza rispetto a sort(), che invece eliminerebbe i nomi.
Ordinamento degli array associativi per chiave
La funzione ksort() ordina per chiave in ordine crescente mantenendo ogni chiave legata al suo valore; krsort() ordina per chiave in ordine decrescente.
$colors = ['red' => '#FF0000', 'blue' => '#0000FF', 'green' => '#008000'];
ksort($colors);
print_r($colors);
// Output: Array ( [blue] => #0000FF [green] => #008000 [red] => #FF0000 )Ordinamento in ordine naturale
Un normale ordinamento di stringhe confronta carattere per carattere, quindi 'img10' viene prima di 'img2' (perché '1' < '2'). La funzione natsort() utilizza un algoritmo di "ordine naturale" che confronta i numeri incorporati come numeri — nel modo in cui un essere umano ordinerebbe i nomi dei file. Preserva le chiavi.
$files = ['img12.png', 'img10.png', 'img2.png', 'img1.png'];
natsort($files);
print_r($files);
// Output: Array ( [3] => img1.png [2] => img2.png [1] => img10.png [0] => img12.png )Utilizzare natcasesort() per lo stesso comportamento, ignorando le maiuscole e minuscole.
Ordinamento personalizzato con usort()
Quando gli ordini predefiniti non sono sufficienti — ordinamento di oggetti, array multidimensionali, o per un valore derivato — usort() consente di fornire una propria funzione di confronto. La callback riceve due elementi e deve restituire un numero negativo, 0, o un numero positivo a seconda che il primo debba venire prima, uguale o dopo il secondo.
$people = [
['name' => 'Mary', 'age' => 32],
['name' => 'Peter', 'age' => 35],
['name' => 'John', 'age' => 28],
];
usort($people, function ($a, $b) {
return $a['age'] <=> $b['age']; // spaceship operator: ascending by age
});
foreach ($people as $person) {
echo $person['name'] . ': ' . $person['age'] . "\n";
}
// Output:
// John: 28
// Mary: 32
// Peter: 35L'operatore "spaceship" <=> restituisce esattamente il valore -1 / 0 / 1 di cui la callback ha bisogno, il che lo rende la scelta idiomatica in questo caso. Se è necessario mantenere le chiavi, usare uasort(); per ordinare in base a una regola di chiave personalizzata, usare uksort().
Scegliere la funzione giusta
- Lista semplice, le chiavi non hanno importanza →
sort()/rsort(). - Array associativo, ordinamento per valore, chiavi da conservare →
asort()/arsort(). - Array associativo, ordinamento per chiave →
ksort()/krsort(). - Nomi di file o stringhe simili a versioni →
natsort()/natcasesort(). - Oggetti, array annidati o qualsiasi regola personalizzata →
usort()/uasort()/uksort().
Se si ha solo bisogno di invertire l'ordine esistente senza riordinare, array_reverse() è più efficiente di un ordinamento completo. Per ordinare più array insieme o per più colonne, vedere array_multisort().
Conclusione
PHP offre un toolkit completo per ordinare gli array e la scelta giusta dipende da due domande: si sta ordinando per valore o per chiave, e si ha bisogno di mantenere le chiavi associate? sort() e rsort() gestiscono le liste semplici, la famiglia a*/k* gestisce i dati associativi, natsort() gestisce l'ordinamento intuitivo per gli esseri umani e la famiglia u* gestisce qualsiasi caso personalizzato. Ricordare che tutte queste funzioni operano sul posto e restituiscono un valore boolean — non un nuovo array.