Как вывести сложный многомерный ассоциативный массив во вложенные списки

0

Я хочу превратить следующий массив во вложенный список в html.

$aMenu = array(
array("name" => "Page 1", 
      "url" => "http://www.microsoft.se", 
      "subpages" => array(
        array("name" => "Subpage 1.1", "url" => "http://www.reddit.com"),
        array("name" => "Subpage 1.2", "url" => "http://www.google.se"),          
        array("name" => "Subpage 1.3", "url" => "http://www.cnn.com"),
    )               
),          
array("name" => "Page 2", "url" => "http://www.facebook.com"),
array("name" => "Page 3",
      "url" => "http://www.bbc.co.uk",
      "subpages" => array(
          array("name" => "Subpage 3.1", "url" => "http://www.jamesedition.com"),
          array("name" => "Subpage 3.2", "url" => "http://www.huffpost.com"),
          array("name" => "Subpage 3.3", 
                "url" => "http://www.lagunitas.com",
                "subpages" => array(
                    array("name" => "Subpage 3.3.1", "url" => "http://www.burton.com"),
                    array("name" => "Subpage 3.3.2", "url" => "http://www.hm.com"),
                    array("name" => "Subpage 3.3.3", "url" => "http://www.apple.com"),
                ),
          ),
      ),                                
),
array("name" => "Page 4", "url" => "http://www.instagram.com"),
array("name" => "Page 5", "url" => "http://www.flickr.com"),
);

Желаемый результат:

  • Страница 1
    • Подстраница 1.1
    • Подстраница 1.2
    • Подстраница 1.3
  • Страница 2
  • Page 3
    • Подстраница 3.1
    • Подстраница 3.2
    • Подстраница 3.3
      • Подстраница 3.3.1
      • Подстраница 3.3.2
      • Подстраница 3.3.3
  • Page 4
  • Page 5

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

Теги:
arrays
multidimensional-array

2 ответа

1

PHP speudo-code:

function list2html($list)
{
  $html = '';
  foreach ($list as $item)
  {
    $html .= '<li>' . $item['name'];
    if ( !empty($item['subpages']) ) // recurse here
      $html .= list2html($item['subpages']);
    $html .= '</li>';
  }
   return '<ul>' . $html . '</ul>';
}

Используйте следующее:

$html_output = list2html($aMenu);

Обратите внимание, что URL-адреса отсутствуют, вам придется изменить функцию, чтобы добавить их

Note2 Recursion не требуется, можно итератировать (или имитировать рекурсию с итерацией), и это будет более быстрый, но более сложный код

  • 0
    Спасибо Никос, это похоже на работу, но выводит списки отдельно, а не как вложенные. Я поэкспериментирую с этим и посмотрю, смогу ли я получить его для вывода вложенного списка. Еще раз спасибо!
  • 0
    @BrianRanney, html-список является вложенным (потому что все подстраницы отображаются внутри текущего элемента li), я бы предложил изменить ваш CSS
0

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

  • 0
    Спасибо за быстрый ответ! Я все еще немного новичок в PHP. Можете ли вы объяснить, что вы имеете в виду немного глубже?
  • 0
    Вы должны сделать функцию, у которой будет массив в качестве параметра. Функция должна выполнить итерацию по этому массиву (то есть с помощью команды foreach) и проверить каждый найденный элемент. Если элемент простой (не массив), функция должна распечатать его в формате html. Но если это массив, функция должна вызывать его самостоятельно и передавать этот массив в качестве параметра. В начале вы должны вызвать функцию с начальным массивом.
Показать ещё 1 комментарий

Ещё вопросы

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