PHP 如何将递归遍历目录函数的返回结果存入数组中
问题原因
你的代码有3个核心错误导致无法正常收集路径:
- PHP数组默认按值传递,递归调用
readDirs($newPath, $result)时修改的是局部的数组副本,上层调用的数组不会同步更新 - 遍历到第一个符合条件的文件时就执行了
return $result,直接终止了当前目录剩余文件、子目录的遍历 - 外层调用函数时没有接收返回值,就算函数返回了结果也不会赋值给外部的
$results变量
修正代码(传引用实现,性能最优)
给数组参数加引用标记&,同时删除提前return的逻辑,遍历完所有内容后统一返回结果:
function readDirs($path , &$result = []) { $dirHandle = opendir($path); while($item = readdir($dirHandle)) { $newPath = $path."/".$item; if(is_dir($newPath) && $item != '.' && $item != '..') { readDirs($newPath, $result); } elseif(!is_dir($newPath) && $item != '.DS_Store' && $item != '.' && $item != '..') { echo "$path<br>"; $result[] = $path; // 移除原有的return逻辑,不要提前终止遍历 } } closedir($dirHandle); // 补充关闭目录句柄,避免资源泄漏 return $result; } $path = "/Users/mycomputer/Documents/www/Photos_projets"; $results = array(); readDirs($path, $results); // 现在$results里已经保存了所有符合条件的路径,可以直接使用 var_dump($results);
补充说明
- 如果你需要收集的是完整文件路径而非文件所在的目录路径,把
$result[] = $path改为$result[] = $newPath即可 - 如果你不想用引用传参,也可以用合并返回值的方式实现,每次递归调用后把子层返回的数组合并到当前数组中:
function readDirs($path , $result = []) { $dirHandle = opendir($path); while($item = readdir($dirHandle)) { $newPath = $path."/".$item; if(is_dir($newPath) && $item != '.' && $item != '..') { // 接收子层返回的结果合并到当前数组 $result = array_merge($result, readDirs($newPath, $result)); } elseif(!is_dir($newPath) && $item != '.DS_Store' && $item != '.' && $item != '..') { $result[] = $path; } } closedir($dirHandle); return $result; } $path = "/Users/mycomputer/Documents/www/Photos_projets"; $results = readDirs($path);
内容的提问来源于stack exchange,提问作者user16995764
相关产品推荐
相关产品推荐

