2012-02-13 23 views
22

È possibile utilizzare usort per ordinare più campi in una matrice multidimensionale? Ad esempio, desidero ordinare name alfabeticamente e quindi da quei record voglio ordinarli per age. È possibile utilizzare sort?Usort PHP ordinamento di più campi

Array ([0] => Array 
       ([name] => Jonah 
       [age] => 27) 
     [1] => Array 
       ([name] => Bianca 
       [age] => 32) 
    ) 
+0

possibili duplicati di [Ordina array multidimensionale con più chiavi] (http://stackoverflow.com/questions/3232965/sort-multidimensional-array-by-multiple-keys) – salathe

risposta

26
usort($arr, function($a, $b) 
{ 
    $name = strcmp($a['name'], $b['name']); 
    if($name === 0) 
    { 
     return $a['age'] - $b['age']; 
    } 
    return $name; 
}); 
+0

Per curiosità, se stessimo ordinando 'name' ma era invece un intero (per esempio), invece di usare 'strcmp' quale funzione consiglieresti di usare? – user1205775

+0

@ user1205775: L'uso di semplici operatori aritmetici funzionerebbe correttamente. –

55

ne dite:

$arr = Array (
    0 => Array (
     'name' => 'Jonah', 
     'age' => '27', 
    ), 
    1 => Array (
     'name' => 'Bianca', 
     'age' => '32', 
    ), 
    2 => Array (
     'name' => 'Jonah', 
     'age' => '25', 
    ), 
    3 => Array (
     'name' => 'Bianca', 
     'age' => '35', 
    ), 
); 
function comp($a, $b) { 
    if ($a['name'] == $b['name']) { 
     return $a['age'] - $b['age']; 
    } 
    return strcmp($a['name'], $b['name']); 
} 

usort($arr, 'comp'); 
print_r($arr); 

uscita:

Array 
(
    [0] => Array 
     (
      [name] => Bianca 
      [age] => 32 
     ) 

    [1] => Array 
     (
      [name] => Bianca 
      [age] => 35 
     ) 

    [2] => Array 
     (
      [name] => Jonah 
      [age] => 25 
     ) 

    [3] => Array 
     (
      [name] => Jonah 
      [age] => 27 
     ) 

) 
5

ne dite:

<?php 

function getRandomName() { 
     $possible = "ab"; 
     $possible_len = strlen($possible); 
     $r = ''; 
     for ($i = 0; $i < 4; $i++) { 
       $r .= substr($possible, mt_rand(0, $possible_len-1), 1); 
     } 
     return ucfirst($r); 
} 

$a = array(); 
for ($i = 0; $i < 10; $i++) { 
     $a[] = array('name' => getRandomName(), 'age' => rand(1,10), 'start_order' => $i); 
} 
$order = array('name' => 'desc', 'age' => 'asc'); 

print_r($a); 

usort($a, function ($a, $b) use ($order) { 
     $t = array(true => -1, false => 1); 
     $r = true; 
     $k = 1; 
     foreach ($order as $key => $value) { 
       $k = ($value === 'asc') ? 1 : -1; 
       $r = ($a[$key] < $b[$key]); 
         if ($a[$key] !== $b[$key]) { 
           return $t[$r] * $k; 
         } 

     } 
     return $t[$r] * $k; 
}); 

print_r($a); 
Problemi correlati