PHP递归遍历目录文件函数失效,返回空数组求助
修复你的PHP递归目录遍历函数
我来帮你排查问题,你的代码里有几个关键错误导致返回空数组,咱们一步步理清楚:
1. 路径拼接的语法问题
你写的$directory . '\'. $file存在语法错误——单个反斜杠在PHP字符串里是转义符,需要写成双反斜杠'\\'才能表示实际的路径分隔符。更稳妥的方式是用PHP内置的DIRECTORY_SEPARATOR常量,它会根据操作系统自动适配\或/,避免跨平台问题。
2. 递归逻辑的致命错误
当遇到子目录时,你直接return printFiles(...),这会让函数立刻终止当前目录的遍历,只返回第一个子目录的结果,完全忽略了当前目录的其他文件和后续子目录。正确的做法是把递归得到的子目录内容合并到当前数组,而不是直接返回。
3. 遗漏了目录本身的记录
你的代码只把文件加入数组,但需求是存入所有目录和文件,所以需要先将子目录本身加入数组,再递归遍历它的内部内容。
修正后的完整代码
<?php function scanDirectory($directory) { $items = array(); // 遍历当前目录下的所有条目 foreach (scandir($directory) as $item) { if ($item === '.' || $item === '..') continue; $fullPath = $directory . DIRECTORY_SEPARATOR . $item; // 如果是目录:先记录目录本身,再递归遍历其子内容并合并到数组 if (is_dir($fullPath)) { $items[] = $item; $items = array_merge($items, scanDirectory($fullPath)); } else { // 如果是文件:直接记录文件名 $items[] = $item; } } return $items; } $directory = 'C:\Users\Jakov\Desktop\DIRECTORIES'; print_r(scanDirectory($directory)); ?>
额外优化建议
如果你需要记录完整路径而不是仅文件名/目录名,只需要把代码中的$item替换成$fullPath即可,比如:
// 记录目录完整路径 $items[] = $fullPath; // 记录文件完整路径 $items[] = $fullPath;
这样修改后,函数就能正确遍历所有层级的目录和文件,把所有条目存入数组返回了。
内容的提问来源于stack exchange,提问作者Jakov
相关产品推荐
相关产品推荐

