Introduzione
Quando si lavora con gli array in PHP, una delle operazioni più comuni è riordinare i dati in base a un criterio preciso. Non si tratta solo di “mettere in ordine” un elenco: spesso bisogna ordinare prodotti per prezzo, utenti per nome, articoli per data, oppure mantenere le chiavi associative mentre si cambia la disposizione degli elementi.
Questo tutorial si concentra su un sotto-argomento molto pratico e spesso sottovalutato: l’ordinamento degli array in PHP con attenzione alla differenza tra valori e chiavi. È un tema utile perché PHP offre diverse funzioni di ordinamento, ma ciascuna ha un comportamento diverso. Scegliere quella sbagliata può causare perdita delle chiavi associative o risultati inattesi.
Vedremo un esempio reale con un catalogo prodotti, poi analizzeremo le funzioni più adatte e le best practice per evitare errori comuni.
Codice completo
<?php
// Catalogo prodotti con array associativo
$prodotti = [
´p100´ => [´nome´ => ´Tastiera meccanica´, ´prezzo´ => 89.90, ´stock´ => 12],
´p101´ => [´nome´ => ´Mouse ergonomico´, ´prezzo´ => 39.50, ´stock´ => 25],
´p102´ => [´nome´ => ´Monitor 27 pollici´, ´prezzo´ => 219.99, ´stock´ => 7],
´p103´ => [´nome´ => ´Cuffie wireless´, ´prezzo´ => 59.00, ´stock´ => 18],
];
// 1) Ordinamento per prezzo crescente, mantenendo le chiavi
$prodottiPerPrezzo = $prodotti;
uasort($prodottiPerPrezzo, function ($a, $b) {
return $a[´prezzo´] <=> $b[´prezzo´];
});
// 2) Ordinamento per nome alfabetico, mantenendo le chiavi
$prodottiPerNome = $prodotti;
uasort($prodottiPerNome, function ($a, $b) {
return strcmp($a[´nome´], $b[´nome´]);
});
// 3) Ordinamento delle chiavi dell´array principale
$chiaviOrdinate = array_keys($prodotti);
sort($chiaviOrdinate);
// 4) Creare un nuovo array ordinato per chiave
$prodottiOrdinatiPerChiave = [];
foreach ($chiaviOrdinate as $chiave) {
$prodottiOrdinatiPerChiave[$chiave] = $prodotti[$chiave];
}
// Stampa dei risultati
echo "<h3>Ordine per prezzo</h3>";
foreach ($prodottiPerPrezzo as $id => $prodotto) {
echo $id . ´ - ´ . $prodotto[´nome´] . ´ - €´ . $prodotto[´prezzo´] . "<br>";
}
echo "<h3>Ordine per nome</h3>";
foreach ($prodottiPerNome as $id => $prodotto) {
echo $id . ´ - ´ . $prodotto[´nome´] . ´ - €´ . $prodotto[´prezzo´] . "<br>";
}
echo "<h3>Ordine per chiave</h3>";
foreach ($prodottiOrdinatiPerChiave as $id => $prodotto) {
echo $id . ´ - ´ . $prodotto[´nome´] . ´ - €´ . $prodotto[´prezzo´] . "<br>";
}
?> Spiegazione
Nel codice sopra abbiamo un array associativo chiamato $prodotti. Ogni elemento è identificato da una chiave come p100, p101 e così via. Questo tipo di struttura è molto comune nelle applicazioni reali, perché le chiavi possono rappresentare ID, codici o slug.
1. Ordinare senza perdere le chiavi: uasort()
La funzione uasort() ordina un array mantenendo le chiavi originali. È perfetta quando vuoi riordinare i dati ma hai bisogno di conservare gli identificatori.
Nel caso dell’ordinamento per prezzo:
uasort($prodottiPerPrezzo, function ($a, $b) {
return $a[´prezzo´] <=> $b[´prezzo´];
}); L’operatore <=>, detto anche spaceship operator, restituisce:
- -1 se il primo valore è minore del secondo
- 0 se sono uguali
- 1 se il primo valore è maggiore del secondo
È una soluzione pulita e leggibile per confrontare valori numerici.
2. Ordinare stringhe in modo corretto: strcmp()
Per ordinare per nome abbiamo usato strcmp(), che confronta due stringhe in modo lessicografico:
uasort($prodottiPerNome, function ($a, $b) {
return strcmp($a[´nome´], $b[´nome´]);
}); Questo approccio è utile quando vuoi un ordinamento alfabetico coerente. In contesti multilingua o con caratteri accentati, però, può essere necessario usare funzioni più specifiche o librerie adatte alla localizzazione.
3. Ordinare le chiavi con array_keys() e sort()
Se invece vuoi ordinare l’array in base alle chiavi, puoi estrarre le chiavi con array_keys(), ordinarle con sort() e poi ricostruire l’array:
$chiaviOrdinate = array_keys($prodotti);
sort($chiaviOrdinate); Questa tecnica è utile quando le chiavi hanno un significato preciso e vuoi controllare l’ordine finale in modo esplicito.
4. Ricostruire un array ordinato
Dopo aver ordinato le chiavi, ricostruisci il nuovo array con un ciclo foreach:
foreach ($chiaviOrdinate as $chiave) {
$prodottiOrdinatiPerChiave[$chiave] = $prodotti[$chiave];
} In questo modo ottieni un array ordinato, ma con la struttura associativa intatta.
Quando usare sort(), asort(), ksort() e uasort()
In PHP esistono diverse funzioni di ordinamento, e la scelta dipende dal tipo di array:
- sort(): ordina i valori e reindicizza l’array numericamente.
- asort(): ordina i valori mantenendo le chiavi.
- ksort(): ordina in base alle chiavi.
- uasort(): ordina i valori con una funzione personalizzata, mantenendo le chiavi.
- uksort(): ordina le chiavi con una funzione personalizzata.
Per gli array associativi complessi, uasort() e uksort() sono spesso la scelta migliore, perché ti permettono di definire regole precise.
Best practice
- Non usare sort() su array associativi se devi conservare le chiavi: le reindicizza e perdi il legame con gli ID originali.
- Usa il confronto corretto: numeri con <=>, stringhe con strcmp() o funzioni più adatte al contesto.
- Copia l’array prima di ordinarlo se vuoi preservare l’originale per altri usi.
- Scrivi callback semplici: una funzione di confronto troppo complessa rende il codice difficile da mantenere.
- Controlla sempre il tipo dei dati: se un campo può essere mancante, gestiscilo prima dell’ordinamento per evitare warning o risultati incoerenti.
- Evita confronti impliciti quando i dati arrivano da form o database: normalizza i valori prima di ordinarli.
Una buona pratica molto utile nei progetti reali è separare i dati originali dalla versione ordinata. In questo modo puoi usare lo stesso array in più punti dell’applicazione senza effetti collaterali.
Riepilogo
Gestire l’ordinamento degli array in PHP non significa solo “mettere in ordine” i dati, ma scegliere la funzione giusta in base alla struttura dell’array e al risultato desiderato. Se lavori con array associativi, spesso devi mantenere le chiavi e ordinare in base a un campo interno, come prezzo, nome o data.
Le funzioni più importanti da ricordare sono:
- uasort() per ordinare valori mantenendo le chiavi
- uksort() per ordinare le chiavi con una logica personalizzata
- asort() e ksort() per ordinamenti semplici
- sort() solo quando non ti interessa preservare le chiavi
Con queste tecniche puoi gestire in modo sicuro cataloghi, liste utenti, risultati di ricerca e qualsiasi struttura dati ordinabile in PHP.
Approfondisci con risorse ufficiali
- PHP Manual - uasort(): documentazione ufficiale sulla funzione di ordinamento personalizzato con mantenimento delle chiavi.
- PHP Manual - uksort(): utile per ordinare array in base alle chiavi con callback.
- PHP Manual - sort(): per capire quando l’array viene reindicizzato.
- PHP Manual - asort(): ordinamento dei valori mantenendo le chiavi.
- PHP Manual - ksort(): ordinamento delle chiavi in modo naturale.
- PHP Manual - operatori di confronto: approfondimento su <=> e sugli altri operatori utili nei confronti.
