Функция рекурсивной сортировки многомерного массива в php по ключу - PullRequest
1 голос
/ 14 июня 2019

У меня есть массив категорий, и я хотел бы создать функцию для их сортировки путем передачи параметра, который функция использует для сортировки массива.

массив, который у меня есть, выглядит следующим образом:

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');

1 Ответ

0 голосов
/ 14 июня 2019

Я понял, почему не могу правильно отсортировать массив ... дочерние категории должны агломерироваться внутри ключа (например, "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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...