我有一个如下所示的PHP数组:
$array = array(
'06930' => array(
'count' => 20
),
'06905' => array(
'count' => 25
),
'06910' => array(
'count' => 15
),
'06903' => array(
'count' => 15
),
'06920' => array(
'count' => 10
),
'06940' => array(
'count' => 5
),
'06915' => array(
'count' => 10
),
);
包含邮政编码和与该邮政编码有关的一些数据(计数,...)。我需要根据计数(DESC)对其进行排序,然后根据邮政编码(ASC)对其再次进行排序,这样结果将如下所示:
$array = array(
'06905' => array(
'count' => 25
),
'06930' => array(
'count' => 20
),
'06903' => array(
'count' => 15
),
'06910' => array(
'count' => 15
),
'06915' => array(
'count' => 10
),
'06920' => array(
'count' => 10
),
'06940' => array(
'count' => 5
),
);
具有更大数量的拉链将位于其他拉链之上,但是如果两个具有相同数量的拉链,则较小的拉链将位于上面。
我可以根据使用次数对它进行排序
uasort($array, function ($a, $b) {
return $b['count'] <=> $a['count'];
});
但是之后无法基于zip排序。
我查看了许多类似的问题和答案,但仍然不知道如何通过主数组键(zip)进行第二次排序。
感谢任何提示。
答案 0 :(得分:1)
array_multisort(array_column($array,'count'), SORT_DESC, SORT_NUMERIC,
array_keys($array), SORT_NUMERIC, SORT_ASC,$array);
答案 1 :(得分:1)
您可以将其更改为使用uksort()
,它为您提供要进行排序的键,还需要将数组传递进来(使用use
),以便它也可以访问值
这将检查计数是否相同,如果相同,它将改为比较键...
uksort($array, function ($a, $b) use ($array) {
if ( $array[$b]['count'] == $array[$a]['count']) {
return $a <=> $b;
}
return $array[$b]['count'] <=> $array[$a]['count'];
});
答案 2 :(得分:1)
@Nigel Ren的答案的简短版本:
uksort($array, function ($a, $b) use ($array) {
return $array[$b]['count'] <=> $array[$a]['count'] ?: $a <=> $b;
});