Как распространить флаг текущего пункта меню вверх в многомерном массиве? - PullRequest
1 голос
/ 19 февраля 2010

У меня есть меню, построенное через многомерный массив.Текущий элемент устанавливается путем сопоставления его атрибута url с текущим запросом.Я хочу, чтобы это значение всплыло перед его родителями, но я не могу на всю жизнь заставить его работать - я уверен, что я был близок, но это оказывается немного сложным.Вот массив:

Array
(
  [children] => Array
    (
        [Home] => Array
            (
                [url] => /
            )

        [The Challenge] => Array
            (
                [url] => /challenge
            )

        [The Finish] => Array
            (
                [url] => /finish
            )

        [Latest News] => Array
            (
                [url] => /latest_news
            )

        [Participants] => Array
            (
                [url] => /participants
                [children] => Array
                    (
                        [Some guy] => Array
                            (
                                [url] => /participants/some_guy
                                [children] => Array
                                    (
                                        [Hats] => Array
                                            (
                                                 [url] => /participants/some_guy/hats
                                                 [current] => 1

По сути, я ищу функцию, которая будет перебирать каждый элемент, пока не найдет флаг [current], а затем не передаст это значение обратно его родителям.В меню нет установленных ограничений по глубине.

Для приведенного выше примера это может привести к:

Array
(
  [children] => Array
    (
        [Home] => Array
            (
                [url] => /
            )

        [The Challenge] => Array
            (
                [url] => /challenge
            )

        [The Finish] => Array
            (
                [url] => /finish
            )

        [Latest News] => Array
            (
                [url] => /latest_news
            )

        [Participants] => Array
            (
                [url] => /participants
                [current] => 1
                [children] => Array
                    (
                        [Some guy] => Array
                            (
                                [url] => /participants/some_guy
                                [current] => 1
                                [children] => Array
                                    (
                                        [Hats] => Array
                                            (
                                                 [url] => /participants/some_guy/hats
                                                 [current] => 1

Ответы [ 2 ]

3 голосов
/ 19 февраля 2010

как

 function set_current($menu) {
    if(!is_array($menu)) return 0;
    if(isset($menu['current'])) return 1;
    foreach($menu as $sub) {
        if(set_current($sub))
            return $menu['current'] = 1;
    }
    return 0;
}

не проверено, потому что вы разместили данные, непригодные для тестирования (о, дорогой, почему они продолжают публиковать эти var_dumps?)

1 голос
/ 19 февраля 2010

Вот модифицированная, рабочая версия:

function set_current(&$menu) {
    if(!is_array($menu)) return false;
    if(isset($menu['current'])) return true;
    if(isset($menu['children'])){
        foreach($menu['children'] as $key => $value) {
            if(set_current($menu['children'][$key])){
                $menu['current'] = true;
                return true;
            }
        }
    }
    return false;
}

Спасибо за помощь; За последние несколько дней я неоднократно был очень близок, просто нужно было, чтобы он был написан немного по-другому, чтобы закончить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...