2011-10-20 14 views
5

È possibile ordinare più array dimensionale per più colonne utilizzando l'ordinamento naturale in PHP? Ecco un esempio. Supponiamo che io abbia una matrice 2D di dati, ad esempio,array_multisort con ordinamento naturale

$array[1]['Name'] = 'John'; 
$array[1]['Age'] = '20'; 
$array[1]['Code'] = 'ABC 12'; 

$array[2]['Name'] = 'John'; 
$array[2]['Age'] = '21'; 
$array[2]['Code'] = 'ABC 1'; 

$array[3]['Name'] = 'Mary'; 
$array[3]['Age'] = '20'; 
$array[3]['Code'] = 'ABC 10'; 

voglio ordinare questo array per nome (ASC), poi per età (DESC), e per codice (ASC), tutto sarà risolto in modo naturale. Fondamentalmente quello sarà array_multisort con ordinamento naturale.

Ho trovato molte soluzioni su questo argomento sul web. Sfortunatamente supportano solo l'ordinamento di una colonna, non di più colonne.

risposta

6

io penso che si debba implementare una funzione di confronto personalizzato per questo comportamento:

function myCmp($a, $b) { 
$nameCmp = strnatcasecmp($a['Name'], $b['Name']); 
$ageCmp = strnatcasecmp($a['Age'], $b['Age']); 
$codeCmp = strnatcasecmp($a['Code'], $b['Code']); 

if ($nameCmp != 0) // Names are not equal 
    return($nameCmp); 

// Names are equal, let's compare age 

if ($ageCmp != 0) // Age is not equal 
    return($ageCmp * -1); // Invert it since you want DESC 

// Ages are equal, we don't need to compare code, just return the comparison result 
    return($codeCmp); 
} 

Poi si può chiamare usort($array, 'myCmp'); e dovrebbe ottenere l'ordinamento desiderato

+0

Grazie !!!!!!!!! –

+0

Eccellente! grazie – TeChn4K

0

Questo codice farebbe il trucco:

// Your original data stored in $array 
$array[1]['Name'] = 'John'; 
$array[1]['Age'] = '20'; 
$array[1]['Code'] = 'ABC 12'; 

$array[2]['Name'] = 'John'; 
$array[2]['Age'] = '21'; 
$array[2]['Code'] = 'ABC 1'; 

$array[3]['Name'] = 'Mary'; 
$array[3]['Age'] = '20'; 
$array[3]['Code'] = 'ABC 10'; 

// Since array_multisort() needs arrays of columns we need to 
// transform it and preserve he keys 
foreach ($array as $key => $row) { 
    $names[$key] = $row['Name']; 
    $ages[$key] = $row['Age']; 
    $codes[$key] = $row['Code']; 
} 

// Sort it according to your criterias 
array_multisort($names, SORT_ASC, $ages, SORT_DESC, $codes, SORT_ASC, $array); 

// $array now contains your sorted array. 

Link tastiera codici: http://codepad.org/tr83Wt5J

+0

Grazie, ma questo è solo il tipo normale, non naturale. –

+0

Oh, stupido. Mancava la parte con ordinamento naturale anche se l'hai menzionata più volte. La soluzione Klaustopher funziona come un incantesimo in quel caso :) – Marcus

1

Se si utilizza PHP 5.4 o versioni successive, è possibile utilizzare array_multisort con il flag SORT_NATURAL.

Problemi correlati