首页 > 解决方案 > 在php中按键递归排序多维数组的函数

问题描述

我有一个类别数组,我想创建一个函数来通过传递一个参数对它们进行排序,该函数使用该参数对数组进行排序。

我拥有的数组是这样的:

Array
(
    [1] = Array
        (
            [id] = 1
            [name] = categoryName1
            [parent] = 0
            [sorting] = 1
            [0] = Array
                (
                    [id] = 6
                    [name] = categoryName6
                    [parent] = 1
                    [sorting] = 3
                )

            [1] = Array
                (
                    [id] = 4
                    [name] = categoryName4
                    [parent] = 1
                    [sorting] = 2
                )

            [2] = Array
                (
                    [id] = 3
                    [name] = categoryName3
                    [parent] = 1
                    [sorting] = 1
                    [0] = Array
                        (
                            [id] = 5
                            [name] = categoryName5
                            [parent] = 3
                            [sorting] = 1

                        )

                )

        )

    [2] = Array
        (
            [id] = 2
            [name] = categoryName2
            [parent] = 0
            [sorting] = 2
        )

)

我尝试了这样的array_multisort:

    function recursive_sort(&$array, $sort_key) {
        foreach ( $array as $k => &$v ) {
            if (is_array($v)) {
                recursive_sort( $v, $sort_key );
            }
        }
        return array_multisort(array_column($array,$sort_key), SORT_ASC, $array);
    }

    recursive_sort($sorted_categories, 'sorting');

但我收到此错误:

array_multisort():数组大小不一致

我期望输出:

Array
(
    [1] = Array
        (
            [id] = 1
            [name] = categoryName1
            [parent] = 0
            [sorting] = 1
            [0] = Array
                (
                    [id] = 3
                    [name] = categoryName3
                    [parent] = 1
                    [sorting] = 1
                    [0] = Array
                        (
                            [id] = 5
                            [name] = categoryName5
                            [parent] = 3
                            [sorting] = 1

                        )

                )

            [1] = Array
                (
                    [id] = 4
                    [name] = categoryName4
                    [parent] = 1
                    [sorting] = 2
                )

            [2] = Array
                (
                    [id] = 6
                    [name] = categoryName6
                    [parent] = 1
                    [sorting] = 3
                )

        )

    [2] = Array
        (
            [id] = 2
            [name] = categoryName2
            [parent] = 0
            [sorting] = 2
        )

)

使用此功能:

recursive_sort($sorted_categories, 'sorting');

标签: phparrayssorting

解决方案


我明白为什么我不能正确地对数组进行排序......子类别必须聚集在一个键(例如“child”)中,如下所示:

Array
(
[1] = Array
    (
        [id] = 1
        [name] = categoryName1
        [parent] = 0
        [sorting] = 1
        [child] = Array
            (
                [0] = Array
                    (
                        [id] = 6
                        [name] = categoryName6
                        [parent] = 1
                        [sorting] = 3
                    )

                [1] = Array
                    (
                        [id] = 4
                        [name] = categoryName4
                        [parent] = 1
                        [sorting] = 2
                    )

                [2] = Array
                    (
                        [id] = 3
                        [name] = categoryName3
                        [parent] = 1
                        [sorting] = 1
                        [child] = Array
                            (
                                [0] = Array
                                    (
                                        [id] = 5
                                        [name] = categoryName5
                                        [parent] = 3
                                        [sorting] = 1
                                    )

                            )

                    )

            )

    )

[2] = Array
    (
        [id] = 2
        [name] = categoryName2
        [parent] = 0
        [sorting] = 2
    )

)

所以我可以用这个函数对数组进行排序

function recursive_sort(&$array, $sort_key) {

    foreach ( $array as $k => &$v ) {
        if (is_array($v)) {
            recursive_sort( $v, $sort_key );
        }
    }

    // at least 2 elements
    if ($array[1]) {
        return array_multisort( array_column( $array, $sort_key ), SORT_DESC, $array );
    }
}
recursive_sort($sorted_categories, 'id');

推荐阅读