首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 遞歸遍歷目錄樹:基於 dir() 類的輕量級實現

     編輯:PHP 相關知識

PHP 內置的 dir() 類提供了面向對象的目錄讀取接口,配合遞歸即可輕松實現目錄樹的完整遍歷。本文展示一個簡潔的遞歸函數,將目錄以粉紅色加粗顯示,文件普通顯示,生成巢狀 HTML 列表,適合快速構建文件管理器原型或調試目錄結構。

完整代碼

<?php
set_time_limit(0); // 防止深層目錄超時

function tree(string $directory): void {
    $mydir = dir($directory);
    echo "<ul>";

    while (($file = $mydir->read()) !== false) {
        // 跳過 . 和 ..
        if ($file === '.' || $file === '..') continue;

        $fullPath = $directory . DIRECTORY_SEPARATOR . $file;

        if (is_dir($fullPath)) {
            // 目錄:粉紅色加粗,遞歸展開
            echo "<li><font color='#ff00cc'><b>$file</b></font></li>";
            tree($fullPath);
        } else {
            // 文件:普通顯示
            echo "<li>$file</li>";
        }
    }

    echo "</ul>";
    $mydir->close();
}

// 程序入口
echo "<h2>目錄為粉紅色</h2>";
tree("."); // 從當前目錄開始

運行效果示例

<h2>目錄為粉紅色</h2>
<ul>
  <li><font color='#ff00cc'><b>src</b></font></li>
  <ul>
    <li>index.php</li>
    <li><font color='#ff00cc'><b>Controller</b></font></li>
    <ul>
      <li>UserController.php</li>
    </ul>
  </ul>
  <li>composer.json</li>
  <li>README.md</li>
</ul>

關鍵點說明

  • dir($path) 返回 Directory 實例,擁有 read()、rewind()、close()、path 屬性。
  • read() 返回文件/目錄名(不含路徑),讀完返回 false。
  • 必須顯式調用 close() 釋放資源,否則可能達到文件描述符限制。
  • 使用 DIRECTORY_SEPARATOR 常量保證跨平台路徑兼容性。
  • set_time_limit(0) 移除執行時間限制,避免深層/大量文件導致超時。

進階優化建議

  1. 改用 RecursiveDirectoryIterator:SPL 迭代器更強大,支持過濾、排序、限制深度等,代碼更符合現代 PHP 風格。
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator('.', FilesystemIterator::SKIP_DOTS),
        RecursiveIteratorIterator::SELF_FIRST
    );
    foreach ($iterator as $file) {
        $indent = str_repeat('  ', $iterator->getDepth());
        echo $indent . ($file->isDir() ? '<b>' : '') . $file->getBasename() . ($file->isDir() ? '</b>' : '') . "<br>";
    }
    
  2. 增加權限檢查:is_readable($fullPath) 避免無權限目錄報警告。
  3. 輸出結構化數據:改為返回數組/JSON,前端用 JS 渲染樹形組件,分離邏輯與視圖。
  4. 大目錄性能:避免在循環中輸出 HTML,改為累積字符串最後一次 echo,或使用生成器分批輸出。

總結

dir() 類雖屬早期 PHP API,但接口直觀、無需額外擴展,配合遞歸幾行代碼即可實現目錄樹遍歷。理解其工作原理有助於掌握文件系統操作基礎,進階場景建議遷移至 SPL 迭代器獲得更豐富功能與更好性能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved