Ordinare un array multidimensionale in php
Mi è capitato ultimamente di dover ordinare gli elementi di un array multimensionale ( per capirci un array di array ) secondo uno degli elementi dell’array. Dopo aver ipotizzato soluzioni iperboliche e complicatissime ho fatto quello che ogni buon programmatore dovrebbe fare. Cercare con Google se qualcuno ha avuto lo stesso problema e vedere come lo ha risolto. Per capirci io ho il seguente array:
$citta = array (
array( 'Torino', 130, 908193 ),
array( 'Roma', 1285, 2728296 ),
array( 'Milano', 181, 1299652 )
);
Ogni elemento è composta da array( ‘nome_città’, ‘superficie’, ‘popolazione’ ). Se volessi ordinare l’array secondo la superficie crescente, quindi per il secondo lavore dell’array, ovvero per il valore in posizione [1] (il conteggio per gli elementi dell’array in php partono da 0) avrò necessità di includere nel codice la seguente funzione:
function compare($x, $y)
{
if ( $x[1] == $y[1] )
return 0;
else if ( $x[1] < $y[1] )
return -1;
else
return 1;
}
Il valore [1] chiamato nella funzione è quello secondo il quale va eseguito l’ordinamento. Per eseguire l’ordinamento dovrò chiamare poi la funzione:
usort($citta, 'compare');
La funzione personalizzata viene passata alla funzione usort come secondo parametro. Attenzione al fatto che va passata come stringa e senza le classiche parentesi tonde con le quali si passano parametri alle funzioni. La funzione usort() così per come viene chiamata in pratica prende l’array $citta e impiega la funzione compare() per eseguire l’ordinamento.
La funzione usort() infatti sta per User SORT, ovvero un ordinamento eseguito in bas ad una funzione definita dall’utente. Similarmente possono essere usate uasort() e uksort() che sono gli equivalenti di asort() e ksort() con funzioni user-defined.
Per ordinare invece un array multidimensionale in ordine decrescente occorre utilizzare la seguente funzione definita dall’utente:
function compare($x, $y)
{
if ( $x[1] == $y[1] )
return 0;
else if ( $x[1] < $y[1] )
return 1;
else
return -1;
}
Non esiste infatti la versione “reverse” sort come per le altre funzioni sort(), asort() e ksort() che si ottiene aggiungendo la lettera “r” alla chiamata ( es. arsort() ). Da notare che a cambiare sono semplicemente i valori ritornati dalla funzione che vengono invertiti di segno.