在php中对多维数组进行排序 - 按值

时间:2012-02-14 13:01:42

标签: php multidimensional-array sorting

例如。

我有以下阵列设置,每个主要的美国城市都有人口规模。

$usapopstats = array(
   array('New York',8008278),
   array('Los Angeles',3694820),
   array('Chicago',2896016),
   array('Houston',1953631),
   array('Philadelphia',1517550),
   array('Phonenix',1321045),
   array('San Diego',1223400),
   array('Dallas',1188580),
   array('San Antonio',1144646),
   array('Detroit',951270)
);

我想按照人口规模的顺序对这些信息进行排序。但是当我尝试使用arsort函数时,它会根据关键数据对数组进行排序,而不是按城市排序的值数据。

所以我的问题是你如何根据这种多维数组的种群大小对排序进行编程?有什么想法吗?

如果像这样重写了数组

$usapopstats = array(
    'New York'=>8008278,
    'Los Angeles'=>3694820,
    'Chicago'=>2896016,
    'Houston'=>1953631,
    'Philadelphia'=>1517550,
    'Phoenix'=>1321045,
    'San Diego'=>1223400,
    'Dallas'=>1188580,
    'San Antonio'=>1144646,
    'Detroit'=>951270
 );
 asort($usapopstats);

这将按人口规模对数组进行排序。

1 个答案:

答案 0 :(得分:1)

您需要创建一个用户排序功能(这是最美观,最快速的程序解决方案:

$usapopstats = array(
    array('New York',8008278),
    array('Los Angeles',3694820),
    array('Chicago',2896016),
    array('Houston',1953631),
    array('Philadelphia',1517550),
    array('Phonenix',1321045),
    array('San Diego',1223400),
    array('Dallas',1188580),
    array('San Antonio',1144646),
    array('Detroit',951270)
);

function sort_helper ($a, $b) {
    if ($a[1] > $b[1]) return 1;
    if ($a[1] == $b[1]) return 0;
    return -1;
}

usort ($usapopstats, sort_helper);
var_dump($usapopstats);

这不是最快的代码,对于最多1000条记录的列表来说很好,但我不会对包含100,000条目的数组这样做。对于每次比较,都会调用sort_helper函数,因为n log n比较是必要的,这意味着函数调用次数也是一样。

如果您需要长列表,请在密钥和ksort:

中对填充进行编码
$usapopstats = array(
    array('New York',8008278),
    array('Los Angeles',3694820),
    array('Chicago',2896016),
    array('Houston',1953631),
    array('Philadelphia',1517550),
    array('Phonenix',1321045),
    array('San Diego',1223400),
    array('Dallas',1188580),
    array('San Antonio',1144646),
    array('Detroit',951270)
);

$statshelper = array();
foreach($usapopstats as $index=>$stat){
    $statshelper[$stat[1]."_".$index] = $stat; //also add the index to the key to avoid duplicates
}

ksort($statshelper, SORT_NUMERIC); //because the keys are strings (they contain an underscore) by default it will compare lexographically. The flag enforces numerical comparison on the part that can be converted to a number (i.e. the population)
$usapopstats = array_values($statshelper);

var_dump($usapopstats);