PHP递归目录菜单

时间:2013-06-17 12:13:11

标签: php html menu iterator directory

我认为之前已经提出了类似的问题,但我不能完全理解我想做的事情是否可以理解。

我目前在内联网上使用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布局。

我认为可能会执行开始标记,但是不确定如果该目录全部列出后如何执行结束标记。

3 个答案:

答案 0 :(得分:1)

更简单的方法是使用树木。我推荐Nested model 您可以检查项目的当前和每个项目。

答案 1 :(得分:1)

递归解决方案可能类似于:

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;
}

这完全未经测试,但应该有所帮助。

答案 2 :(得分:0)

好的,这就是我最后得到的结果,感谢Jim的示例代码:

    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来说就像一个绝对的魅力,在使用该功能创建菜单时,我可以像我想要的那样一般或细化。

我会将此标记为答案,但Jim明智地给了我最好的起点!