按子数组数量对数组进行排序

5

我有一个像这样的数组:

Array(
   ['some_first_category'] => Array(
            ['some_first_name'] => Array(
                           [0]=>'first@email.com',
                           [1]=>'second@email.com',
                           [2]=>'third@email.com',
                           [3]=>'fourth@email.com' )
             ['some_second_name'] => Array (
                           [1]=>'first@email.com',
                           [2]=>'second@email.com')
             ['some_third_name'] => Array(
                           [1]=>'first@email.com',
                           [2]=>'second@email.com',
                           [3]=>'third@email.com',
                           [4]=>'fourth@email.com' )
   ['some_second_category'] => Array(
            ['some_first_name'] => Array(
                           [0]=>'first@email.com' )
             ['some_second_name'] => Array(
                           [1]=>'first@email.com',
                           [2]=>'second@email.com',
                           [3]=>'third@email.com',
                           [4]=>'fourth@email.com')
             ['some_third_name'] => Array(
                           [1]=>'first@email.com',
                           [2]=>'second@email.com'))

我希望按照名称数量对数组进行排序。在我的情况下,我希望变成这个数组:

Array(
   ['some_first_category'] => Array(
             ['some_third_name'] => Array(
                           [1]=>'first@email.com',
                           [2]=>'second@email.com',
                           [3]=>'third@email.com',
                           [4]=>'fourth@email.com' )
            ['some_first_name'] => Array(
                           [0]=>'first@email.com',
                           [1]=>'second@email.com',
                           [2]=>'third@email.com',
                           [3]=>'fourth@email.com' )
             ['some_second_name'] => Array (
                           [1]=>'first@email.com',
                           [2]=>'second@email.com')

   ['some_second_category'] => Array(
             ['some_second_name'] => Array(
                           [1]=>'first@email.com',
                           [2]=>'second@email.com',
                           [3]=>'third@email.com',
                           [4]=>'fourth@email.com')
             ['some_third_name'] => Array(
                           [1]=>'first@email.com',
                           [2]=>'second@email.com')
            ['some_first_name'] => Array(
                           [0]=>'first@email.com' ))

这意味着按名称及名称值数量(count)对类别进行排序。有人能帮我吗? 提前致谢, Aäron

我看到你想按子元素数量降序排序第二层(“名称”),但你是否也想按某种逻辑对第一层(“类别”)进行排序? - Passerby
它没有排序。它只是根据您的需求显示的特定内容。 - hjpotter92
我也想让别人洗我的车!但如果我自己洗不好,那就可以请朋友帮忙! - user1646111
人们应该明白,这个网站的目的是提供支持,而不是完整的问题解决方案。你必须自己动手去做,如果你需要帮助,那没关系,但是如果什么都没尝试就直接要求答案,那就太不负责任了。 - Naryl
3个回答

17

你所需的只是uasort

uasort($list, function ($a, $b) {
    $a = count($a);
    $b = count($b);
    return ($a == $b) ? 0 : (($a < $b) ? -1 : 1);
});

完整示例

$list = Array(
   'some_first_category' => Array(
            'some_first_name' => Array(
                           0=>'first@email.com',
                           1=>'second@email.com',
                           2=>'third@email.com',
                           3=>'fourth@email.com' ),
             'some_second_name' => Array (
                           1=>'first@email.com',
                           2=>'second@email.com'),
             'some_third_name' => Array(
                           1=>'first@email.com',
                           2=>'second@email.com',
                           3=>'third@email.com',
                           4=>'fourth@email.com' )
        ),
   'some_second_category' => Array(
            'some_first_name' => Array(
                           0=>'first@email.com' ),
             'some_second_name' => Array(
                           1=>'first@email.com',
                           2=>'second@email.com',
                           3=>'third@email.com',
                           4=>'fourth@email.com'),
             'some_third_name' => Array(
                           1=>'first@email.com',
                           2=>'second@email.com'))

    );

$list = array_map(function ($v) {
    uasort($v, function ($a, $b) {
        $a = count($a);
        $b = count($b);
        return ($a == $b) ? 0 : (($a < $b) ? 1 : - 1);
    });
    return $v;
}, $list);


print_r($list);

输出

Array
(
    [some_first_category] => Array
        (
            [some_first_name] => Array
                (
                    [0] => first@email.com
                    [1] => second@email.com
                    [2] => third@email.com
                    [3] => fourth@email.com
                )

            [some_third_name] => Array
                (
                    [1] => first@email.com
                    [2] => second@email.com
                    [3] => third@email.com
                    [4] => fourth@email.com
                )

            [some_second_name] => Array
                (
                    [1] => first@email.com
                    [2] => second@email.com
                )

        )

    [some_second_category] => Array
        (
            [some_second_name] => Array
                (
                    [1] => first@email.com
                    [2] => second@email.com
                    [3] => third@email.com
                    [4] => fourth@email.com
                )

            [some_third_name] => Array
                (
                    [1] => first@email.com
                    [2] => second@email.com
                )

            [some_first_name] => Array
                (
                    [0] => first@email.com
                )

        )

)

不要将函数放在函数的参数中。这与jQuery无关:P - dognose
2
@dognose 所以你宁愿毫无意义地将闭包分配给一个变量或者在全局命名空间中添加函数标识符,是吗?避免使用内联闭包的唯一原因是需要支持<=5.2版本,如果需要这样做,那就需要更好的工作和/或主机。 - DaveRandom
非常感谢您,Baba!!我已经自己尝试使用usort函数,但它没有维护数组的键。感谢大家的帮助! - Ari
@DaveRandom 在我看来,排序函数与上下文无关。因此,我可能会重复使用它,所以是的,我会将它放在全局某个地方,这样我就不需要重写或复制/粘贴它了。 - dognose

5

使用 uksort 函数:

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

使用array_multisort:

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

而且您也可以看到uasort

祝您好运 :)


1
完美,谢谢... array_multisort(array_map('count', $yourArray), SORT_DESC, $yourArray); 这个对我有用。 - Abhishek Goel
uasort($yourArray, function($a, $b) { return count($b) - count($a); }); 对我非常有效。如果您想要反转排序顺序,可以在计数函数中交换 $a 和 $b。 - murtho

1
你应该使用usort函数。请参考这里
function sort_sub($a,$b)
{
$res= count($b)-count($a);
return $res;
}

usort($array_name,'sort_sub')

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