Сортировать рекурсивный многомерный массив по определенному ключу

0

Я пытаюсь сортировать этот массив рекурсивно по его метке:

Array
(
    [0] => Array
        (
            [id] => 6
            [label] => Bontakt
            [children] => Array
                (
                )

        )

    [1] => Array
        (
            [id] => 7
            [label] => Ampressum
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 5
                            [children] => Array
                                (
                                )

                            [label] => Bome
                        )

                    [1] => Array
                        (
                            [id] => 8
                            [children] => Array
                                (
                                )

                            [label] => Aome
                        )

                    [2] => Array
                        (
                            [id] => 10
                            [children] => Array
                                (
                                )

                            [label] => Come
                        )

                )

        )

    [2] => Array
        (
            [id] => 9
            [label] => Contakt
            [children] => Array
                (
                )

        )

    [3] => Array
        (
            [id] => 11
            [label] => Dead
            [children] => Array
                (
                )

        )

)

Я прочитал несколько Вопросов, и я чувствую себя довольно близко, но я не могу понять, что не работает:

function sortByAlpha($a, $b)
{
    return strcmp(strtolower($a['label']), strtolower($b['label'])) > 0;
}

function alphaSort(&$a)
{
    foreach ($a as $oneJsonSite)
    {
        if (count($oneJsonSite["children"]) > 0) alphaSort($oneJsonSite["children"]);
    }

    usort($a, 'sortByAlpha');
}


alphaSort($jsonSites);

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

Ampressum
    Bome
    Aome
    Come
Bontakt
Contakt
Dead

Элементы детей не отсортированы...

  • 0
    @MikeBrant. Внимательно посмотрите на функцию alphaSort ;-)
  • 0
    Извините, я пропустил это :)
Теги:
arrays
multidimensional-array
recursion

1 ответ

1
Лучший ответ

Проверь это:

Чтобы иметь возможность напрямую изменять элементы массива в цикле, перед значением $ value нужно указать &. В этом случае значение будет присвоено по ссылке. (Выбрано отсюда: http://php.net/manual/en/control-structures.foreach.php)

Вы должны попробовать это с помощью этого:

function alphaSort(&$a)
{
    foreach ($a as &$oneJsonSite)
    {
        if (count($oneJsonSite["children"]) > 0) alphaSort($oneJsonSite["children"]);
    }

    usort($a, 'sortByAlpha');
}
  • 0
    Спасибо, это сработало отлично! Не возражаете, если я отредактирую ваш ответ с рабочим кодом?
  • 0
    Приятно! Вы можете отредактировать это :-)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню