Я пытаюсь создать динамические многоуровневые меню, получая данные из базы данных MySQL, используя PHP. Мне удалось заказать элементы меню в массиве php с этим форматом:
----------------------- Array ( [1] => Array ( [id] => 1 [ubicacion] => top_a [nivel] => 1 [parent_id] => [tipo] => link [link] => http://www.google.com [titulo] => Google [alias] => google_es [children] => Array ( [3] => Array ( [id] => 3 [ubicacion] => top_a [nivel] => 2 [parent_id] => 1 [tipo] => link [link] => http://www.gmail.com [titulo] => Gmail [alias] => gmail [children] => Array ( [4] => Array ( [id] => 4 [ubicacion] => top_a [nivel] => 3 [parent_id] => 3 [tipo] => link [link] => www.inbox.gmail.com [titulo] => Inbox [alias] => inbox_gmail ) ) ) ) ) [2] => Array ( [id] => 2 [ubicacion] => top_a [nivel] => 1 [parent_id] => [tipo] => link [link] => http://www.yahoo.com [titulo] => Yahoo [alias] => yahoo ) ) -----------------------
Проблема в том, что я не могу понять, как вывести этот массив как разметку HTML таким образом, чтобы он работал с n уровнями. Я могу сделать это с фиксированным количеством уровней:
foreach($menu_array as $menu) { echo "<li><a href='{$menu['link']}'>{$menu['titulo']}</a>"; if (array_key_exists('children',$menu)) { echo "<ul>"; foreach ($menu['children'] as $child_menu) { echo "<li><a href='{$child_menu['link']}'>{$child_menu['titulo']}</a>"; if (array_key_exists('children',$child_menu)) { echo "<ul>"; foreach ($child_menu['children'] as $child2_menu) { echo "<li><a href='{$child2_menu['link']}'>{$child2_menu['titulo']}</a>"; } echo "</ul>"; } } echo "</ul>"; } echo "</li>"; }
Но это работает только для трех уровней, и я знаю, что должен быть способ решить эту проблему, я знаю, что я не первый, столкнувшийся с проблемой вывода HTML многомерного массива.
Вы можете просто использовать небольшую рекурсию, чтобы получить больше уровней.
function echo_menu($menu_array) { //go through each top level menu item foreach($menu_array as $menu) { echo "<li><a href='{$menu['link']}'>{$menu['titulo']}</a>"; //see if this menu has children if(array_key_exists('children', $menu)) { echo '<ul>'; //echo the child menu echo_menu($menu['children']); echo '</ul>'; } echo '</li>'; } } echo '<ul>'; echo_menu($menu_array); echo '</ul>';
Это будет работать для любого количества дочерних уровней, которые вы хотите.