0

我认为以前已经问过类似的问题,但我不能完全确定我想做的事情是否在逻辑上是可能的。

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

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

4

3 回答 3

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

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

于 2013-06-17T12:57:40.867 回答
1

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

于 2013-06-17T12:19:27.797 回答
1

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

我会将此标记为答案,但吉姆给了我最好的代码起点!

于 2013-06-18T10:36:06.717 回答