2012-03-19 111 views
0

所以我需要實現這個網站上排序顯示:排序PHP數組陣列由3場

http://news.bbc.co.uk/sport2/hi/olympics/medals_table/default.stm

而我的陣列的一部分是這樣的:

[1] => Array 
    (
     [country_id] => 3 
     [country_name] => Russia 
     [gold] => 23 
     [silver] => 21 
     [bronze] => 28 
     [total] => 72 
    ) 

[2] => Array 
    (
     [country_id] => 189 
     [country_name] => USA 
     [gold] => 36 
     [silver] => 38 
     [bronze] => 36 
     [total] => 10 
    ) 

[3] => Array 
    (
     [country_id] => 230 
     [country_name] => Germany 
     [gold] => 16 
     [silver] => 10 
     [bronze] => 15 
     [total] => 41 
    ) 

[4] => Array 
    (
     [country_id] => 231 
     [country_name] => China 
     [gold] => 51 
     [silver] => 21 
     [bronze] => 28 
     [total] => 100 
    ) 

所以我需要按金,銀,銅,然後country_name排列數組。

有沒有人有這個想法?

+0

http://www.php.net/manual/en/function.usort .php +自定義回調 – 2012-03-19 18:32:48

+0

你的排序參數是什麼?看起來每個金屬類型都有單獨的權重,就像點系統一樣。然後你根據總分數來排序。 – 2012-03-19 18:37:20

+0

這是針對olimpic遊戲,請參閱問題主體中的鏈接。 – Splendid 2012-03-19 18:38:49

回答

1

使用uasort功能:

$arr = array(
    Array(
    'country_id' => 3, 
    'country_name' => 'Russia', 
    'gold' => 23, 
    'silver' => 21, 
    'bronze' => 28, 
    'total' => 72, 
), 
    Array(
    'country_id' => 189, 
    'country_name' => 'USA', 
    'gold' => 36, 
    'silver' => 38, 
    'bronze' => 36, 
    'total' => 10, 
), 
    Array(
    'country_id' => 230, 
    'country_name' => 'Germany', 
    'gold' => 16, 
    'silver' => 10, 
    'bronze' => 15, 
    'total' => 41, 
), 
    Array(
    'country_id' => 231, 
    'country_name' => 'China', 
    'gold' => 51, 
    'silver' => 21, 
    'bronze' => 28, 
    'total' => 100, 
) 
); 

function mySort($a,$b) { 
    if ($b['gold'] == $a['gold']) { 
     if ($b['silver'] == $a['silver']) { 
      if ($b['bronze'] == $a['bronze']) { 
       return strcmp($b['country_name'], $a['country_name']); 
      } else { 
       return $b['bronze'] - $a['bronze']; 
      } 
     } else { 
      return $b['silver'] - $a['silver']; 
     } 
    } else { 
     return $b['gold'] - $a['gold']; 
    } 
} 

uasort($arr, 'mySort'); 
print_r($arr); 

輸出:

Array 
(
[1] => Array 
    (
     [country_id] => 189 
     [country_name] => USA 
     [gold] => 36 
     [silver] => 38 
     [bronze] => 36 
     [total] => 10 
    ) 

[0] => Array 
    (
     [country_id] => 3 
     [country_name] => Russia 
     [gold] => 23 
     [silver] => 21 
     [bronze] => 28 
     [total] => 72 
    ) 

[3] => Array 
    (
     [country_id] => 231 
     [country_name] => China 
     [gold] => 51 
     [silver] => 21 
     [bronze] => 28 
     [total] => 100 
    ) 

[2] => Array 
    (
     [country_id] => 230 
     [country_name] => Germany 
     [gold] => 16 
     [silver] => 10 
     [bronze] => 15 
     [total] => 41 
    ) 

) 
+0

我會分析一下 - 謝謝,但是你的輸出不是很好:)因爲中國有大多數金牌中國應該在第一名 - http://news.bbc.co.uk/sport2/hi/olympics/medals_table/default。 stm – Splendid 2012-03-19 19:24:33

+0

愚蠢但問題在這一行:)如果($ a ['gold'] == $ a ['gold'])... – Splendid 2012-03-19 19:26:10

+0

@Splendid:是的,已更正。我首先按升序排序,然後倒置所有$ a和$ b,除了一個:( – Toto 2012-03-19 19:33:58

0

我知道的兩個選項:

  1. usort()通過使用用戶定義的比較函數值對數組進行排序;
  2. ksort()按鍵排序數組。

希望這個答案有幫助。

0

也許你可以找到更短的方式。但是,這也可能有助於

function my_sort($a, $b) { 
    if($a['gold'] > $b['gold']) { 
     return -1; 
    } 
    elseif ($a['gold'] == $b['gold']) { 
     if($a['silver'] > $b['silver']) { 
      return -1; 
     } 
     elseif ($a['silver'] == $b['silver']) { 
      if ($a['bronze'] > $b['bronze']) { 
       return -1; 
      } 
      elseif ($a['bronze'] == $b['bronze']) { 
      return strcmp($b['country_name'], $a['country_name']); 
      } 
      return 1; 
     } 
     return 1; 
    } 
    return 1; 
} 

usort($arr, 'my_sort'); 

print_r($arr);