2009-12-08 37 views
0

排序我的數組有困難。它看起來像這樣:在PHP中排序表格

[0] => Array 
     (
      [firstname] => Jnic 
      [lastname] => Fortin 
      [points] => Array 
       (
        [id] => 20453 
        [f] => 31 
        [r] => 7     
        [total] => 82 
       ) 

     ) 

    [1] => Array 
     (
      [firstname] => Kris 
      [lastname] => Anders 
      [points] => Array 
       (
        [id] => 20309      
        [f] => 0 
        [r] => 1 
        [total] => 56 
       ) 

     ) 
[2] => Array 
      (
       [firstname] => Em 
       [lastname] => Zajo 
       [points] => Array 
        (
         [id] => 20339      
         [f] => 8 
         [r] => 3 
         [total] => 254 
        ) 

      ) 

我想通過「總」 DESC對它進行排序。我怎麼能這樣做?如果一切順利的話,數組將會是order [2] [0] [1](254,82,56)

回答

4

您可能會使用usort函數:它使用回調函數比較數組該數組的元素:

bool usort (array &$array , callback $cmp_function ) 

該函數將排序通過使用用戶提供的 比較功能 其值的數組。如果您 希望數組排序需要通過 排序一些非平凡的標準,你應該 使用此功能

如果你的函數定義每$element['points']['total']比較,它應該做的伎倆。


編輯:這裏是例如,使用uasort,這是一樣的usort,但將保持數組鍵,就像ryanday指出:

首先,讓我們來聲明數組:

$a = array(
    array(
     'firstname' => 'Jnic', 
     'lastname' => 'Fortin', 
     'points' => array(
      'id' => 20453, 
      'f' => 31, 
      'r' => 7, 
      'total' => 82, 
     ), 
    ), 
    array(
     'firstname' => 'Kris', 
     'lastname' => 'Anders', 
     'points' => array(
      'id' => 20309, 
      'f' => 0, 
      'r' => 1, 
      'total' => 56, 
     ), 
    ), 
    array(
     'firstname' => 'Em', 
     'lastname' => 'Zajo', 
     'points' => array(
      'id' => 20339, 
      'f' => 8, 
      'r' => 3, 
      'total' => 254, 
     ), 
    ), 
); 

,然後比較函數:

function my_compare($a, $b) { 
    if ($a['points']['total'] > $b['points']['total']) { 
     return -1; 
    } else if ($a['points']['total'] < $b['points']['total']) { 
     return 1; 
    } 
    return 0; 
} 

最後,我們使用它:

uasort($a, 'my_compare'); 
var_dump($a); 

,並獲得陣列,通過total降序排序:

array 
    2 => 
    array 
     'firstname' => string 'Em' (length=2) 
     'lastname' => string 'Zajo' (length=4) 
     'points' => 
     array 
      'id' => int 20339 
      'f' => int 8 
      'r' => int 3 
      'total' => int 254 
    0 => 
    array 
     'firstname' => string 'Jnic' (length=4) 
     'lastname' => string 'Fortin' (length=6) 
     'points' => 
     array 
      'id' => int 20453 
      'f' => int 31 
      'r' => int 7 
      'total' => int 82 
    1 => 
    array 
     'firstname' => string 'Kris' (length=4) 
     'lastname' => string 'Anders' (length=6) 
     'points' => 
     array 
      'id' => int 20309 
      'f' => int 0 
      'r' => int 1 
      'total' => int 56 


ryanday>謝謝您的回答!

0

我注意到你說的正確排列的,要責令[2] [0] [1],如果您按照帕斯卡與uasort()函數建議,索引關係是非常重要的。

1

你將要使用usort由@Pascal MARTIN作爲回答,但這裏是完整的代碼來實現你想要的:

function total_sort($a, $b){ 
    $a_total = $a['points']['total']; 
    $b_total = $b['points']['total']; 

    if($a_total == $b_total) return 0; 

    return ($a_total > $b_total) ? -1 : 1; 
} 

usort($array, "total_sort"); 

編輯:後,我貼我看到@Pascal更新了他的答案包括一個樣本。由於我寫了我的排序函數有點不同,所以我把它作爲另一個參考。

0

usort是一個強大的解決方案,可以非常靈活的複雜情況。由於您的數據集是比較簡單的,我建議如下:

// assuming your array has been defined in $a 
$sort = array(); 
foreach ($a as $key => $suba) 
{ 
    // this collects the values you want to sort by and associates them with the correct index 
    $sort[$key] = $suba['points']['total']; 
} 
// this sorts the collected values 
sort($sort); 

// this re-sorts $a according to the sorted $sort array 
array_multisort($a, $sort); 

不知道性能,但這個至少是一樣好usort如果不是更好