Php 按子数组计数对数组排序

Php 按子数组计数对数组排序,php,multidimensional-array,Php,Multidimensional Array,我有一个如下所示的数组: Array( ['some_first_category'] => Array( ['some_first_name'] => Array( [0]=>'first@email.com', [1]=>'second@email.com', [2]=>'

我有一个如下所示的数组:

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' ))
这意味着根据名称值的数量(计数)按名称对类别进行排序。有人能帮我吗? 提前感谢,

Aäron

你需要的只是


您应该使用usort函数。参考

使用:

使用数组\u多重排序:

array_multisort(array_map('count', $yourArray), SORT_DESC, $yourArray);
你也可以看到


祝您好运:)

我看到您希望按子元素的数量降序对第二级(“名称”)进行排序,但是否也希望按某种逻辑对第一级(“类别”)进行排序?它没有排序。这只是一个专门针对你需要的展示。我还想找个人帮我洗车!但是,如果我洗了,我失败了,可以请朋友帮我!ppl应该知道,这一方应该给予支持,而不是问题的完整解决方案。如果你需要帮助,你只需要做这项工作,这没关系,但是要求解决方案,不尝试任何便宜的方法。不要把函数放在函数的参数中。这不是jQuery:P@dognose那么,您宁愿无意义地将闭包分配给一个变量,或者用一个函数标识符来混乱全局名称空间?避免内联闭包的唯一原因是如果您需要支持,非常感谢Baba!!usort函数我自己已经尝试过了,但是它没有维护数组的键。谢谢大家的帮助@DaveRandom排序函数与上下文imho无关。所以我可能会重复使用它,所以是的,我会把它放在全球某个地方,因为这样我就不需要重写或复制/粘贴它了。非常感谢。。。array\u multisort(array\u map('count',$yourray),SORT\u DESC,$yourray);这对我来说是有效的
uasort($yourArray,function($a,$b){returncount($b)-count($a);})对我很有用。如果要反转排序顺序,可以在计数函数中交换$a和$b。
$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
                )

        )

)
function sort_sub($a,$b)
{
$res= count($b)-count($a);
return $res;
}

usort($array_name,'sort_sub')
uksort($yourArray, function($a, $b) { return count($b) - count($a); });
array_multisort(array_map('count', $yourArray), SORT_DESC, $yourArray);