2012-05-16 46 views
3

我有以下數組,我需要從最高分到最低分。基於多值對多維數組排序

Array 
(
    [0] => Array 
     (
      [team id] => 5 
      [score] => 52 
      [fouls] => 0 
     ) 

    [1] => Array 
     (
      [team id] => 4 
      [score] => 47 
      [fouls] => 0 
     ) 

    [2] => Array 
     (
      [team id] => 8 
      [score] => 46 
      [fouls] => 6 
     ) 

    [3] => Array 
     (
      [team id] => 1 
      [score] => 46 
      [fouls] => 5 
     ) 

    [4] => Array 
     (
      [team id] => 9 
      [score] => 46 
      [fouls] => 3 
     ) 

) 

陣列上方已經有了這個功能已經被排序:

function sortByOrder($a, $b){ 
    $Return = $b['score'] - $a['score']; 
    return $Return; 
} 

usort($Array, 'sortByOrder'); 

這似乎因爲與得分最高的陣列上升名單做工精細。

但是,一些球隊的得分相同,但犯了一些犯規。當一個分數等於另一個分數時,我怎樣才能調整這個函數來考慮犯規呢?應該將犯規最少的球隊置於更高的位置。

期待創造性的解決方案!

在此先感謝。

+1

'if($ b ['score'] == $ a ['score'])'sortByOrder這樣的東西? –

回答

7

你只需要更新你的功能sortByOrder()

基本上是:

function sortByOrder($a, $b){ 
    if ($b['score'] == $a['score']) 
    return $a['fouls'] - $b['fouls']; 
    else 
    return $b['score'] - $a['score']; 
} 
+0

如果犯規包含負值會怎麼樣? –

+0

這可能是無稽之談,但比較兩支球隊時得分相同,例如「-3犯規」會比「-1犯規」更好(或者更大) –

+0

那麼我該如何解決呢?由於一些數組在犯規中具有負值。我需要-3比-1更差 –

0

我想象你正在使用usort不保持條目的原始密鑰關聯排序您的數組的訂單。

您可以進一步細化排序功能打破平局當你的主要排序是通過使用這種平等:

function sortByOrder($a, $b) { 
    if ($a['score'] == $b['score']) { 
     return ($a['fouls'] < $b['fouls']) ? -1 : 1;; 
    } 
    return ($a['score'] < $b['score']) ? -1 : 1; 
} 

NB也請與您的用戶定義的排序方法,注意你需要返回的只有兩個值在這種情況下是-1(a小於b)和1(a大於b)。