Рекурсивное меню каталога PHP

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

В настоящее время я использую DDSmoothMenu в нашей интрасети, чтобы перечислить документы, которые у нас есть для доступа всех сотрудников.

Структура меню будет выглядеть примерно так:

Documents -> Finance -> Forms -> File 1 -> File 2 -> File 3 -> Informational -> File 1 -> File 2 -> Insurance -> File 1 -> File 2 

Ниже приведена базовая структура меню:

 <ul> <li><a href='#'>Sub Menu Name</a> <ul> <li><a href='#'>Menu Item</a></li> <li><a href='#'>Menu Item</a></li> <li><a href='#'>Menu Item</a></li> <li><a href='#'>Menu Item</a></li> </ul> </li> </ul> 

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

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

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

 function createMenuHTML($dir){ $html = ""; if(is_dir($dir)){ //Directory - add sub menu $html .= "<li><a href='#'>Sub Menu Name</a><ul>"; if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { $html .= createMenuHTML($dir.$file); } closedir($dh); } $html .= "</ul>" }else{ //File so just add list item $html .= "<li><a href='#'>".basename($dir)."</a></li>" } return $html; } 

Это полностью непроверено, но, надеюсь, поможет.

Более простой способ – использовать деревья. Я рекомендую Вложенную модель. Вы можете проверить текущее и perv lvl элемента.

Итак, вот что я получил благодаря примерному коду Джима:

  function createMenu($dir) { if(is_dir($dir)) { echo "<li><a href='#'>".basename($dir)."</a><ul>"; foreach(glob("$dir/*") as $path) { createMenuHTML($path); } echo "</ul></li>"; } else { $extension = pathinfo($dir); $extension = $extension['extension']; echo "<li><a href='$dir'>".basename($dir, ".".$extension)."</a></li>"; } } createMenu("/public/Documents"); 

Работает как абсолютное обаяние для моего DDSMoothMenu, и я могу быть как общим, так и гранулярным, как я хочу, используя эту функцию для создания меню.

Я буду отмечать это как ответ, но Джим дал мне лучшую отправную точку возможного кода!