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) 移除執行時間限制,避免深層/大量文件導致超時。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>";
}
is_readable($fullPath) 避免無權限目錄報警告。echo,或使用生成器分批輸出。dir() 類雖屬早期 PHP API,但接口直觀、無需額外擴展,配合遞歸幾行代碼即可實現目錄樹遍歷。理解其工作原理有助於掌握文件系統操作基礎,進階場景建議遷移至 SPL 迭代器獲得更豐富功能與更好性能。