按子数组计数降序对多维数组进行排序,并保留一级键


Sort a multidimensional array descending by subarray count and preserve first level keys

我有一个数组,例如:

$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],
    ]
];

我想按照内部数组项的数量(count(((降序排列这个数组(即大多数项优先(,所以我会有这个数组:

[
    '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],
    ]
];

有人能提出一个有效的方法吗?谢谢

使用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');
<?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);
?>
$tempArr = $sortedArr = array();
foreach ($myArr as $k => $v) $tempArr[$k] = count($v);
asort($tempArr);
foreach ($tempArr as $k => $v) $sortedArr = $myArr[$k];

请注意,如果任何数组值本身不是数组,这将中断,您可能需要在某个位置添加is_array()检查。。。

如果您只担心按大小排序,而不担心实际质量,则可以使用最简单的方法使用arsort()按降序排序并保留键。

成员较少的数组较小,如果在操作数2中找不到操作数1中的键,则数组是不可比的,否则-逐值比较(参见以下示例(

如果您有多个大小相同的行,那么它们将根据实际数据进一步降序排列。

代码:(演示(

arsort($array);
var_export($array);