2012-02-13 54 views
22

Có thể sử dụng usort để sắp xếp nhiều trường trong một mảng đa chiều không? Ví dụ: tôi muốn sắp xếp name theo thứ tự abc và sau đó từ những bản ghi này, tôi muốn sắp xếp chúng theo age. Điều này có thể sử dụng sort không?PHP usort sắp xếp nhiều trường

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

có thể trùng lặp của [Phân loại mảng đa chiều bằng nhiều khóa] (http://stackoverflow.com/questions/3232965/sort-multidimensional-array-by-multiple-keys) – salathe

Trả lời

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

Hết sức tò mò, nếu tôi sắp xếp 'tên' nhưng nó là một số nguyên thay vì (ví dụ), thay vì sử dụng 'strcmp' bạn sẽ khuyên dùng hàm nào? – user1205775

+0

@ user1205775: Chỉ cần sử dụng toán tử số học đơn giản sẽ hoạt động tốt. –

55

Làm thế nào về:

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

đầu ra:

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

Làm thế nào về:

<?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); 
Các vấn đề liên quan