W3docs

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:

  1. 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.
  2. Mantenere l'associazione chiave→valore? sort()/rsort() scartano le chiavi originali e reindicizzano da 0. La famiglia a* e k* preserva l'associazione.
FunzioneOrdina perOrdineMantiene le chiavi?
sort()valorecrescenteno (reindicizzato)
rsort()valoredecrescenteno (reindicizzato)
asort()valorecrescente
arsort()valoredecrescente
ksort()chiavecrescente
krsort()chiavedecrescente
usort()valore (personalizzato)regola personalizzatano (reindicizzato)
uasort()valore (personalizzato)regola personalizzata
uksort()chiave (personalizzata)regola personalizzata

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: 35

L'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.

Pratica

Pratica
Quali delle seguenti sono funzioni di ordinamento integrate valide in PHP?
Quali delle seguenti sono funzioni di ordinamento integrate valide in PHP?
Was this page helpful?