簡體   English   中英

PHP的array_multisort不工作

[英]php array_multisort not working

我遇到了這個問題,我想根據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仍未排序嗎?

您可以輕松地使用用戶定義的比較函數,而不是進行所有值的復制和濫用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,並期望按它們出現的順序給出答案。 與$ b相比,如果$ a應該首先出現,則排序函數必須返回-1;如果相等則返回0;如果$ a應該最后出現,則返回1。

我的代碼首先測試分數是否相等。 如果不是,則最后一個返回值將比較哪個分數更高($ a> $ b),並且最高分數首先進入列表(如果a大於b,則返回-1表示a首先進入)。

如果分數相等,將測試分數。 如果它們不相等,則再次進行比較。 否則返回0。

團隊列表中得分和得分相等的任何條目都可能出現在結果中的任意位置(但不是隨機的-相同的輸入數組將始終按相同的順序排序),因為沒有指定進一步的順序。 如果願意,您可以通過添加名稱或ID的另一個比較來輕松擴展排序。

如果您希望從0開始重新排序數組,請使用usort()而不是uasort()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM