Лучший способ сверлить массив, чем вложенный цикл? - PullRequest
0 голосов
/ 09 ноября 2010

У меня есть структура меню (Drupal), которая содержит элементы, представляющие ссылку меню.Если меню имеет дочернее меню (является родительским для подменю), оно имеет ключ массива «внизу» с элементом меню внутри с такой же структурой.Теоретически это меню может быть бесконечно глубоким, и единственный способ, которым я знаю, как пройти через каждый уровень, - это создать новый цикл для элемента, если «внизу» что-то есть.Я знаю, что должен быть более элегантный и динамичный способ справиться с этим.Я на самом деле не ищу конкретный ответ для Drupal, так как эта проблема уже возникала, и я только что взломал ее вместе.Спасибо за чтение!

Ответы [ 2 ]

1 голос
/ 09 ноября 2010

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

<?php
function deepPrintArr (array $arr)
{
    $output = '';
    foreach ($arr as $elem)
    {
        if (is_array $elem)
        {
            $output .= deepPrintArr ($elem);
        }
        else
        {
            $output .= "<p>$elem</p>\n";
        }
    }
    return ($output);
}

echo (deepPrintArr ($some_deeply_nested_array));
?>
0 голосов
/ 09 ноября 2010

Пожалуйста, найдите время, чтобы «прочитать» /inc/menu.inc в вашем коде drupal.Этот файл содержит множество очень полезных функций, некоторые из которых не упоминаются ни в одной документации.Например, menu_get_active_trail () показывает текущий активный путь для активной страницы.Это намного проще, чем рекурсивный цикл по всем пунктам меню в вашем собственном коде.

Для этого сайта: Qrios Я написал код для создания двухуровневого меню в Drupal:

   <?php $base_tree = menu_tree_page_data($use_menu);
    //Debug
    //print_r($tree);
    foreach ($base_tree as $item) {
      if ($item['link']['in_active_trail'] == 1){
        $tree = $item['below'];
      }else{
        $tree = array(); //empty array
      }
    } ?>

Не уверен, что это то, что вы имеете в виду, но у вас есть идея использовать функции Drupals.Вам просто нужно их найти.

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