php 实现目录树
实现目录树的基本思路
通过递归或迭代方式遍历目录结构,将文件和子目录组织成树形结构。PHP提供scandir()和is_dir()等函数用于目录操作。
使用递归实现目录树
递归方法适合处理嵌套层级不确定的目录结构。以下是一个递归生成目录树的示例代码:
function buildDirectoryTree($dir, $prefix = '') {
$tree = '';
$files = array_diff(scandir($dir), ['.', '..']);
foreach ($files as $i => $file) {
$path = $dir . DIRECTORY_SEPARATOR . $file;
$isLast = ($i == count($files) - 1);
$tree .= $prefix . ($isLast ? '└── ' : '├── ') . $file . "\n";
if (is_dir($path)) {
$tree .= buildDirectoryTree(
$path,
$prefix . ($isLast ? ' ' : '│ ')
);
}
}
return $tree;
}
// 使用示例
echo buildDirectoryTree('/path/to/directory');
使用迭代实现目录树
迭代方法通过栈结构避免递归可能导致的性能问题,适合处理深层目录:
function buildDirectoryTreeIterative($rootDir) {
$stack = [];
$output = '';
array_push($stack, [$rootDir, 0]);
while (!empty($stack)) {
list($currentDir, $level) = array_pop($stack);
$files = array_diff(scandir($currentDir), ['.', '..']);
foreach (array_reverse($files) as $file) {
$path = $currentDir . DIRECTORY_SEPARATOR . $file;
$prefix = str_repeat('│ ', $level);
if (is_dir($path)) {
$output .= $prefix . '├── ' . $file . "\n";
array_push($stack, [$path, $level + 1]);
} else {
$output .= $prefix . '└── ' . $file . "\n";
}
}
}
return $output;
}
生成HTML格式目录树
如需在网页中显示可交互的目录树,可生成HTML结构:
function buildHtmlDirectoryTree($dir) {
$html = '<ul>';
$files = array_diff(scandir($dir), ['.', '..']);
foreach ($files as $file) {
$path = $dir . DIRECTORY_SEPARATOR . $file;
$html .= '<li>' . htmlspecialchars($file);
if (is_dir($path)) {
$html .= buildHtmlDirectoryTree($path);
}
$html .= '</li>';
}
return $html . '</ul>';
}
注意事项
- 路径处理应使用
DIRECTORY_SEPARATOR保证跨平台兼容性 - 对用户提供的目录路径需做安全性验证
- 大目录结构可能导致内存问题,可考虑分页加载
- 输出到HTML时需使用
htmlspecialchars()防止XSS攻击
性能优化建议
- 对大目录使用缓存机制
- 限制递归深度防止栈溢出
- 考虑使用
FilesystemIterator替代scandir()提升性能







