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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:36:08