根据子数组值对PHP多维数组进行排序,然后对主数组键进行排序

时间:2019-12-03 12:02:22

标签: php arrays sorting

我有一个如下所示的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)进行第二次排序。

感谢任何提示。

3 个答案:

答案 0 :(得分:1)

使用array_multisort()

array_multisort(array_column($array,'count'), SORT_DESC, SORT_NUMERIC,
                array_keys($array), SORT_NUMERIC, SORT_ASC,$array);

输出:-https://3v4l.org/QCrZf

答案 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;
});