You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:51:47