【问题标题】:PHP recursive directory menuPHP递归目录菜单
【发布时间】:2013-06-13 09:21:16
【问题描述】:

我认为以前有人问过类似的问题,但我无法完全确定我想做的事情是否合乎逻辑。

我目前在我们的 Intranet 上使用 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 布局。

我认为可以做开始标签,但不知道一旦该目录全部列出后如何做结束标签。

【问题讨论】:

    标签: php html menu iterator directory


    【解决方案1】:

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

    【讨论】:

    • 谢谢,会检查一下。
    【解决方案2】:

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

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

    这完全未经测试,但希望能有所帮助。

    【讨论】:

    • 太棒了,会玩这个,看看我能想出什么。
    【解决方案3】:

    好的,感谢 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 为我提供了代码方面的最佳起点!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-28
      • 2013-11-05
      • 2012-12-27
      • 2010-10-24
      • 2011-03-10
      • 2023-04-04
      • 2013-06-17
      • 2013-12-01
      相关资源
      最近更新 更多