簡體   English   中英

PHP遞歸目錄菜單

[英]PHP recursive directory menu

我認為之前已經提出了類似的問題,但是我無法完全理解我想要做的事情是否符合邏輯。

我目前在內聯網上使用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布局。

我認為可能會執行開始標記,但不確定如果該目錄全部列出后如何執行結束標記。

更簡單的方法是使用樹木。 我推薦嵌套模型你可以檢查項目的當前和perv lvl。

遞歸解決方案可能類似於:

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

這完全未經測試,但應該有所幫助。

好的,所以這就是我最后得到的結果,感謝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明智地給了我最好的起點!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM