php array_multisort无效

时间:2012-02-18 12:54:57

标签: php arrays sorting

我遇到了这个问题,我想根据2个参数排序多维数组

我像这样构建我的数组:

$teamList[$t['id']] = array(
    'id'     => $t['id'], 
    'name'   => $t['name'], 
    'score'  => $score, 
    'points' => $array
);

然后我这样排序:

foreach ($teamList as $key => $row) {
        $score[$key]  = $row['score'];
        $points[$key] = $row['points'];    
}
array_multisort($score, SORT_DESC, $points, SORT_DESC, $teamList);  

但是$ teamList仍然未分类?

1 个答案:

答案 0 :(得分:0)

您可以轻松使用用户定义的比较功能,而不是执行所有值复制和滥用array_multisort()

function sortByScoreAndPoints($a, $b) {
  if ($a['score'] == $b['score']) {
    if ($a['points'] == $b['points']) {
      return 0;
    }
    return ($a['points'] > $b['points']) ? -1 : 1;
  }
  return ($a['score'] > $b['score']) ? -1 : 1;
}

uasort($teamlist, 'sortByScoreAndPoints');

sort函数必须接受两个可以具有任意名称的参数,但在文档中使用$ a和$ b。在排序过程中,PHP将数组的任意两个值作为$ a和$ b传递,并期望得到它们应该出现的顺序的答案。如果首先出现$ a,则排序函数必须返回-1,如果它们相等则返回0,如果$ a最后出现,则返回1,与$ b相比。

我的代码首先测试分数是否相等。如果没有,最后一次回报将比较哪个得分更高($ a> $ b),并且高分得分首先进入列表(如果a大于b,则返回-1表示先得分)。

如果分数相等,则将测试分数。如果它们不相等,则再次进行比较。否则返回0。

团队列表中具有相同分数和分数的任何条目可能出现在结果中的任意位置(但不是随机的 - 相同的输入数组将始终排序相同),因为没有指定进一步的排序。如果您愿意,可以通过添加名称或ID的另一个比较来轻松扩展排序。

如果您希望从0开始重新排列已排序的数组,请使用usort()而不是uasort()