W3docs

Come ordinare stringhe in ordine naturale in PHP

La funzione natsort() di PHP ordina un array in ordine naturale, trattando i numeri nelle stringhe come valori numerici anziché come caratteri.

Quando si ordinano stringhe che contengono numeri in PHP, l'ordinamento alfabetico predefinito produce spesso risultati che sembrano "sbagliati" a un lettore umano. La funzione natsort() di PHP risolve questo problema ordinando un array con un algoritmo di ordine naturale — lo stesso modo in cui una persona ordinerebbe file1, file2, file10 invece di file1, file10, file2.

Questa pagina spiega cos'è l'ordinamento in ordine naturale, come funziona natsort() (incluso il fatto che preserva le chiavi), come differisce da sort(), come gestire le maiuscole e le problematiche comuni.

Cos'è l'ordinamento in ordine naturale?

L'ordinamento in ordine naturale (detto anche ordinamento alfanumerico) tratta le sequenze di cifre all'interno di una stringa come un singolo numero anziché come singoli caratteri. Con un ordinamento puramente alfabetico, "100" viene prima di "2" perché il confronto si ferma al primo carattere e '1' è minore di '2' nella tabella ASCII. L'ordinamento in ordine naturale confronta invece 100 e 2 come numeri, quindi 2 viene correttamente prima.

Questo è importante ogni volta che le stringhe mescolano testo e numeri — nomi di file (img10.png), etichette di versione (v2.13) o elementi come "10 mele" e "2 arance".

Sintassi

natsort(array &$array): true

natsort() riceve l'array per riferimento, lo ordina in-place e (a partire da PHP 8.2) restituisce sempre true. Nelle versioni precedenti il tipo di ritorno è bool. Poiché l'array viene modificato direttamente, non si assegna il risultato a una variabile — si legge la variabile originale dopo la chiamata.

Come usare la funzione natsort()

Confronta l'ordine naturale con un normale ordinamento alfabetico sort():

$fruits = array("10 apples", "2 oranges", "100 bananas");

natsort($fruits);
print_r($fruits);

Output:

Array
(
    [1] => 2 oranges
    [0] => 10 apples
    [2] => 100 bananas
)

Si noti che le chiavi originali (1, 0, 2) vengono mantenute e spostate con i loro valorinatsort() è un ordinamento che preserva le chiavi, proprio come asort(). Se si usasse invece sort(), si otterrebbe il risultato alfabetico (e reindicizzato):

Array
(
    [0] => 10 apples
    [1] => 100 bananas
    [2] => 2 oranges
)

Qui "100 bananas" finisce al centro perché sort() confronta carattere per carattere.

Ordinamento di nomi simili a file

Il caso d'uso classico è l'ordinamento di nomi di file che terminano con numeri:

$files = array("file20", "file3", "file1");

natsort($files);
print_r($files);

Output:

Array
(
    [2] => file1
    [1] => file3
    [0] => file20
)

Un ordinamento normale posizionerebbe file20 prima di file3 — raramente quello che si vuole quando si elencano file.

natsort() è sensibile alle maiuscole

natsort() confronta le lettere maiuscole prima di quelle minuscole (i codici ASCII maiuscoli sono inferiori). L'input con maiuscole e minuscole miste raggruppa quindi prima le maiuscole:

$images = array("img12", "img10", "IMG2", "img1");

natsort($images);
print_r($images);

Output:

Array
(
    [2] => IMG2
    [3] => img1
    [1] => img10
    [0] => img12
)

IMG2 viene ordinato prima dei nomi in minuscolo. Quando le maiuscole devono essere ignorate, si usa la variante case-insensitive natcasesort():

$images = array("img12", "img10", "IMG2", "img1");

natcasesort($images);
print_r($images);

Output:

Array
(
    [3] => img1
    [2] => IMG2
    [1] => img10
    [0] => img12
)

Avvertenze e limitazioni

  • Le chiavi vengono preservate. Se si ha bisogno di un indice pulito a base zero dopo l'ordinamento, si esegue array_values($array) una volta completato.
  • Ordina in-place. L'array viene passato per riferimento; non scrivere $x = natsort($arr) — questo memorizza il valore booleano di ritorno, non l'array ordinato.
  • Sensibile alle maiuscole per impostazione predefinita. Si ricorra a natcasesort() quando le maiuscole non devono influenzare l'ordine.
  • Solo array. natsort() non funziona su stringhe o oggetti. Per ordinare una stringa delimitata, si usa explode() per convertirla in array, si ordina e poi si riconverte con implode().
  • Confronto a coppie. Internamente usa la stessa logica di strnatcmp(); per una regola personalizzata, si ordina con usort() e il proprio comparatore.

Conclusione

natsort() ordina un array in ordine naturale leggibile dall'utente, trattando i numeri incorporati come valori numerici e preservando le chiavi dell'array. Si usa per nomi di file, stringhe di versione e qualsiasi elenco che mescola testo con numeri — si passa a natcasesort() quando le maiuscole non devono importare, e si ricorda di reindicizzare con array_values() se si hanno bisogno di chiavi sequenziali. Per altre esigenze di ordinamento, si esplorano le funzioni di ordinamento degli array correlate.

Esercizio

Pratica
Cosa fa la funzione natsort() in PHP?
Cosa fa la funzione natsort() in PHP?
Was this page helpful?