2009-12-08 39 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如果不是更好