sabato 19 luglio 2008

PHP: Funzioni di ordinamento array

PHP possiede diverse funzioni dedicate all'ordinamento di array. Credo sia utile vedere alcuni esempi anche perché, a mio parere, quelli presenti sulla documentazione ufficiale non sono sempre lineari e facili da capire.

Inizieremo da esempi molto semplici potrei tranquillamente dire banali.

Ordinamento di array a una dimensione

Ordinamento degli elementi di un array

Consideriamo il seguente codice

$a = array(9,4,2,7,5);
sort($a);
print_r($a);

Il risultato di questo esempio è

Array
(
  [0] => 2
  [1] => 4
  [2] => 5
  [3] => 7
  [4] => 9
)

La funzione sort() ordina l'array in ordine crescente in base al valore degli elementi. Esiste anche una funzione rsort() che svolge un'operazione analoga, ma con ordinamento decrescente.

Altro esempio sempre utilizzando lo stesso array

$a = array(9,4,2,7,5);
asort($a);
print_r($a);
Il risultato è
Array
(
  [2] => 2
  [1] => 4
  [4] => 5
  [3] => 7
  [0] => 9
)

asort() ordina l'array in ordine crescente in base al valore degli elementi, ma, a differenza di sort(), mantiene l'associazione chiavi / valori dell'array originario. Per questo motivo è particolarmente utile quando si lavora con array associativi.

Nell'esempio seguente abbiamo un array associativo in cui ogni chiave è il nome di una squadra associato al rispettivo punteggio. Ecco come possiamo visualizzare una 'classifica'.

$a = array(
  'Fiorentina' => 66,
  'Inter' => 85,
  'Juventus' => 72,
  'Roma' => 82
);
arsort($a);
print_r($a);

Utilizziamo arsort(), l'omologa di asort() per l'ordinamento decrescente, perché vogliamo ordinare dal punteggio più alto al più basso ottenendo questo risultato

Array
(
  [Inter] => 85
  [Roma] => 82
  [Juventus] => 72
  [Fiorentina] => 66
)

Ordinamento delle chiavi di un array

Per ordinare un array in base al valore delle chiavi si utilizza ksort(). Ordiniamo l'array delle squadre visto in precedenza con questa funzione

ksort($a);

otteniamo

Array
(
  [Fiorentina] => 66
  [Inter] => 85
  [Juventus] => 72
  [Roma] => 82
)

La funzione krsort() è analoga, ma effettua un ordinamento decrescente delle chiavi.

Ordinamento naturale

La funzione natsort() ordina le stringhe contenenti valori numerici in modo più 'naturale', cioè più simile a quanto farebbe un essere umano, rispetto agli algoritmi usati dalle altre funzioni di ordinamento.

Vediamo un esempio. Questo è l'array da ordinare

$a=array('A4','A11','B6','A2','B400','B3','B31');

ordinamento con sort()

sort($a);
print_r($a);

Risultato

Array
(
  [0] => A11
  [1] => A2
  [2] => A4
  [3] => B3
  [4] => B31
  [5] => B400
  [6] => B6
)

Ordinamento con natsort()

natsort($a);
print_r($a);

Risultato

Array
(
  [3] => A2
  [0] => A4
  [1] => A11
  [5] => B3
  [2] => B6
  [6] => B31
  [4] => B400
)

Confrontando i due risultati si nota come natsort() ordini numericamente la parte numerica delle stringhe. Inoltre le associazioni chiavi valori sono preservate analogamente a quanto accade con asort().

La funzione natcasesort() è del tutto analoga tranne per il fatto che l'ordinamento non è sensibile alle maiuscole e minuscole.

Ordinamento di array multidimensionali

Tra le funzioni per l'ordinamento di array, array_multisort() è forse la più complessa. Serve ad ordinare più array insieme o un array multidimensionale, rispetto a una o più delle sue dimensioni: è di questo secondo utilizzo che vedremo un esempio.

Consideriamo il seguente codice

$a = array(
  array(5, 7, 8, 5),
  array(1, 2, 6, 4)
);
array_multisort($a[0], SORT_ASC, $a[1], SORT_DESC);

$a è un array a più dimensioni (o array di array se si preferisce). Il risultato dell'ordinamento è

Array
(
  [0] => Array
    (
      [0] => 5
      [1] => 5
      [2] => 7
      [3] => 8
    )

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

Il funzionamento può non essere facile da capire a prima vista. Il tutto però risulta più chiaro se rappresentiamo come tabella l'array multidimensionale da ordinare (i numeri in grassetto sono gli indici).

Array di partenza,

  | 0 | 1 | 2 | 3 |
0 | 5 | 7 | 8 | 5 |
1 | 1 | 2 | 6 | 4 |

Array risultante dopo l'esecuzione di array_multisort().

  | 0 | 1 | 2 | 3 |
0 | 5 | 5 | 7 | 8 |
1 | 4 | 1 | 2 | 6 |

L'array è stato ordinato in ordine crescente (SORT_ASC) in base al valore degli elementi della prima dimensione (la prima riga); quando due di questi elementi hanno lo stesso valore (nell'esempio 5), l'ordinamento è stato fatto in base agli elementi corrispondenti della seconda dimensione (la seconda riga) e questa volta l'ordine è decrescente (SORT_DESC): la colonna contenente i valori 5-4 è posta prima di quella contenente 5-1.

L'ordine degli argomenti passati ad array_multisort() detta la priorità dei criteri di ordinamento. Chi ha familiarità con il linguaggio SQL riconoscerà che la situazione è del tutto analoga a quella che si verifica quando si specificano più campi di ordinamento in una clausola ORDER BY.

Spero che questa breve panoramica delle funzioni PHP per l'ordinamento di array sia stata utile. Non è certo mia intenzione duplicare la documentazione ufficiale del PHP a cui consiglio di fare riferimento per numerosi dettagli che ho necessariamente omesso e per esempi di codice più complessi di quelli sopra presentati.

3 commenti:

Anonimo ha detto...

molto utile!

Anonimo ha detto...

Bravo!!!

Massimo ha detto...

Grazie :)

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.