2012-03-19 72 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);