简体   繁体   English

按3个字段对数组的php数组进行排序

[英]Sorting php array of arrays by 3 fields

So I need to implement sorting show on this website: 所以我需要在这个网站上实现排序显示:

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

And part of my array looks like this: 我的数组的一部分看起来像这样:

[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
    )   

So I need to sort array by gold,silver,bronze and then country_name. 因此,我需要按金,银,青铜和country_name的顺序对数组进行排序。

Does anyone have some idea for this ? 有人对此有想法吗?

use uasort function : 使用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);

output: 输出:

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
    )

)

I know of two options: 我知道两个选择:

  1. usort() to sort the array by values using a user-defined comparison function; usort()使用用户定义的比较函数按值对数组进行排序;
  2. ksort() to sort the array by key. ksort()通过键对数组排序。

Hope this answer is helpful enough. 希望这个答案足够有用。

Probably there is shorter way u can find. 也许您可以找到更短的方法。 But this may also help 但这可能也有帮助

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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM