按子数组数量降序排序多维数组并保留第一层键

29
我有一个数组如下所示:
$array = [
    'DEF' => [
        ['type' => 1, 'id' => 1212, 'name' => 'Jane Doe', 'current' => 1],
        ['type' => 1, 'id' => 3123121, 'name' => 'Door', 'current' => null],
    ],
    'ABC' => [
        ['type' => 1, 'id' => 1234, 'name' => 'John Doe', 'current' => null],
    ],
    'WW' => [
        ['type' => 1, 'id' => 1212, 'name' => 'Jane Doe', 'current' => 1],
        ['type' => 1, 'id' => 3123121, 'name' => 'Door', 'current' => null],
        ['type' => 1, 'id' => 64646, 'name' => 'Floor', 'current' => null],
    ]
];

我希望按照内部数组的项目数量进行降序排序(即首先是最多的项目),以便我得到如下数组:

[
    'WW' => [
        ['type' => 1, 'id' => 1212, 'name' => 'Jane Doe', 'current' => 1],
        ['type' => 1, 'id' => 3123121, 'name' => 'Door', 'current' => null],
        ['type' => 1, 'id' => 64646, 'name' => 'Floor', 'current' => null],
    ],
    'DEF' => [
        ['type' => 1, 'id' => 1212, 'name' => 'Jane Doe', 'current' => 1],
        ['type' => 1, 'id' => 3123121, 'name' => 'Door', 'current' => null],
    ],
    'ABC' => [
        ['type' => 1, 'id' => 1234, 'name' => 'John Doe', 'current' => null],
    ]
];

有人能建议一个高效的方法吗?谢谢。


为什么不使用 usort http://www.php.net/manual/en/function.usort.php? - Joseph Silber
请使用 var_export 函数来输出数组。 - Arnaud Le Blanc
4个回答

40

使用uksort函数:

uksort($array, function($a, $b) { return count($b) - count($a); });

使用 array_multisort

array_multisort(array_map('count', $array), SORT_DESC, $array);

使用 PHP < 5.3:

function sort_cb($a, $b) {
    return count($b) - count($a);
}
uksort($array, 'sort_cb');

1
如果您使用的是PHP < 5.3.0版本,则需要将该匿名函数移出。 - NullUserException
4
不建议使用 PHP 版本低于 5.3.0 的版本。;) - Arnaud Le Blanc
uksort() 的例子没有起作用,因为我丢失了数组键('ABC','DEF','WW'),但是 array_multisort() 起作用了——谢谢! - Aviram
4
这句话需要翻译为:这不应该使用uksort,而应该使用usort对吗? - Hirnhamster
2
uksort 按键排序。键不能是数组,而且 count 不会计算任何东西。usort 比较值,这些值可以是数组。 - Grzegorz

4
<?php
function cmp($a, $b)
{
    if ($a == $b) {
        return 0;
    }
    return (count($a) > count($b)) ? -1 : 1;
}

$a = array(
"AA" => array(
        array('type'=>'1', 'id'=>'2'),
        array('type'=>'2', 'id'=>'2')),
'BB' => array(
        array('type'=>'1', 'id'=>'2'),
        array('type'=>'2', 'id'=>'2'),
        array('type'=>'5', 'id'=>'2')),
'CC' => array(
        array('type'=>'1', 'id'=>'2'))
);  

usort($a, "cmp");

print_r($a);
?>

如果您使用的是PHP 7,现在只需执行count($a) <=> count($b)即可 :) - galdikas
这正是我所需要的,谢谢。 - Aaron

1
$tempArr = $sortedArr = array();
foreach ($myArr as $k => $v) $tempArr[$k] = count($v);
asort($tempArr);
foreach ($tempArr as $k => $v) $sortedArr = $myArr[$k];

请注意,如果任何数组值本身不是数组,则会出现错误,您可能需要在某个地方添加一个is_array()检查...

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接