2012-02-13 2 views
22

Можно ли использовать usort для сортировки нескольких полей в многомерном массиве? Например, я хочу сортировать name в алфавитном порядке, а затем из этих записей я хочу отсортировать их по age. Возможно ли это с помощью sort?PHP usort сортировка нескольких полей

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

возможный дубликат [Сортировка многомерного массива несколькими ключами] (http://stackoverflow.com/questions/3232965/sort-multidimensional-array-by-multiple-keys) – salathe

ответ

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

Из любопытства, если бы я сортировал 'имя', но вместо этого вместо него использовалось целое число (например) вместо 'strcmp', какую функцию вы бы рекомендовали использовать? – user1205775

+0

@ user1205775: Простое использование простых арифметических операторов будет работать нормально. –

55

Как насчет:

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

выход:

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

Как насчет:

<?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); 
Смежные вопросы