2012-02-13 15 views
22

Czy można użyć usort do sortowania wielu pól w tablicy wielowymiarowej? Na przykład chcę sortować alfabetycznie według alfabetu name, a następnie sortować je według age. Czy jest to możliwe przy użyciu sort?Sortowanie wielu pól w usludze PHP

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

możliwych duplikatów [Sortuj tablicę wielowymiarową za pomocą wielu kluczy] (http://stackoverflow.com/questions/3232965/sort-multidimensional-array-by-multiple-keys) – salathe

Odpowiedz

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

Z ciekawości, gdybym sortował "imię", ale zamiast tego zamiast nazwy "strcmp" była to liczba całkowita, której funkcji poleciłbyś używać? – user1205775

+0

@ user1205775: Używanie prostych operatorów arytmetycznych działałoby dobrze. –

55

Jak o:

$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); 

wyjściowa:

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

Jak o:

<?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); 
Powiązane problemy