PHP-如何按和值对这个多维数组进行排序


PHP - How can I sort this multi dimensional array by sum value?

如何根据嵌套最深的数组中每个集合的和值对该数组进行排序?

$arr = Array(
    Array(
        'I am the first string.',
        Array(
            Array( 'round', 1, 1 ),
            Array( 'rhythm', 1, 1 )
        )
    ),
    Array(
        'I am the second string',
        Array(
            Array( 'cps', 1, 1 ),
            Array( 'Hz', 1, 3 ),
            Array( 'hertz', 1, 1 )
        )
    ),
    Array(
        'I am the third string.',
        Array(
            Array( 'uucps', 1, 1 ),
            Array( 'uuHz', 1, 2 ),
            Array( 'uuhertz', 1, 1 )
        )
    )
);

我需要根据最深集(第三维度)的第三个键的和值对数组的第二维度进行排序。

所以最终结果会是这样的:

$arr = Array(
    Array(
        'I am the second string',
        Array(
            Array( 'cps', 1, 1 ),
            Array( 'Hz', 1, 3 ),
            Array( 'hertz', 1, 1 )
        )
    ),
    Array(
        'I am the third string.',
        Array(
            Array( 'uucps', 1, 1 ),
            Array( 'uuHz', 1, 2 ),
            Array( 'uuhertz', 1, 1 )
        )
    ),
    Array(
        'I am the first string.',
        Array(
            Array( 'round', 1, 1 ),
            Array( 'rhythm', 1, 1 )
        )
    )
);

我知道usort可能是我最好的选择,但我似乎无法使它适用于我的用例。

使用usortarray_sumarray_column函数的解决方案:

usort($arr, function($a, $b){
    $prev = array_sum(array_column($a[1], 2)); // summing up values for each third key (2)
    $next = array_sum(array_column($b[1], 2));
    return $next - $prev;    
});
print_r($arr);

输出:

Array
(
    [0] => Array
        (
            [0] => I am the second string
            [1] => Array
                (
                    [0] => Array
                        (
                            [0] => cps
                            [1] => 1
                            [2] => 1
                        )
                    [1] => Array
                        (
                            [0] => Hz
                            [1] => 1
                            [2] => 3
                        )
                    [2] => Array
                        (
                            [0] => hertz
                            [1] => 1
                            [2] => 1
                        )
                )
        )
    [1] => Array
        (
            [0] => I am the third string.
            [1] => Array
                (
                    [0] => Array
                        (
                            [0] => uucps
                            [1] => 1
                            [2] => 1
                        )
                    [1] => Array
                        (
                            [0] => uuHz
                            [1] => 1
                            [2] => 2
                        )
                    [2] => Array
                        (
                            [0] => uuhertz
                            [1] => 1
                            [2] => 1
                        )
                )
        )
    [2] => Array
        (
            [0] => I am the first string.
            [1] => Array
                (
                    [0] => Array
                        (
                            [0] => round
                            [1] => 1
                            [2] => 1
                        )
                    [1] => Array
                        (
                            [0] => rhythm
                            [1] => 1
                            [2] => 1
                        )
                )
        )
)