PHP实现递归获取目录内所有文件(含扩展名过滤)

追风的人
追风的人
发布时间:2026-10-13 | 2人浏览过
原创

在PHP开发中,有时需要获取一个目录下及其子目录的所有文件列表。本示例提供一个名为scan_dir的函数,利用递归方式遍历文件系统,并支持根据文件扩展名进行过滤,返回结构化的树状数组。

功能目标与原理

结果或目标:输入一个有效目录路径和一个可选的扩展名过滤数组,输出一个关联数组,键为文件名,值为文件路径或包含子文件的嵌套数组。

准备条件:Web服务器环境已安装PHP,且脚本具有读取目标目录及子目录的权限。

第1步:导入递归扫描函数

以下代码实现了核心逻辑。它使用scandir读取目录内容,通过is_dir判断是否为子目录。如果是子目录,则递归调用自身;如果是文件,则检查其扩展名是否在允许的过滤器列表中。

/**
 * 递归获取文件夹内所有文件
 * 返回一个TREE结构的文件系统
 * @param string $dir   要扫描的目标目录
 * @param array $filter  要保留的文件扩展名数组 (例如 ['jpg', 'png'])
 * @return array|false  文件树状数组或失败标志
 */
function scan_dir($dir, $filter = array()){
  / 1. 验证目录有效性
  if(!is_dir($dir)) return false;
  
  / 2. 读取目录项并去除 '.' 和 '..'
  $files = array_diff(scandir($dir), array('.', '..'));
  
  / 3. 遍历每个文件项
  if(is_array($files)){
    foreach($files as $key=>$value){
      / 3a. 处理子目录:递归扫描并替换原键值
      if(is_dir($dir . '/' . $value)){
        $files[$value] = scan_dir($dir . '/' . $value, $filter);
        unset($files[$key]);
        continue;
      }
      
      / 3b. 处理文件:提取扩展名
      $pathinfo = pathinfo($dir . '/' . $value);
      $extension = array_key_exists('extension', $pathinfo) ? $pathinfo['extension'] : '';
      
      / 3c. 过滤:如果设置了过滤且扩展名不在列表中,则删除该项
      if(!empty($filter) && !in_array($extension, $filter)){
        unset($files[$key]);
      }
    }
  }
  
  / 4. 清理临时变量并返回结果
  unset($key, $value);
  return $files;
}

第2步:理解关键操作细节

  • 路径拼接:始终使用$dir . '/' . $value确保路径正确指向内部文件或子目录。
  • 数组结构:当遇到子目录时,原文件名变为数组索引,其值为再次调用scan_dir的结果,从而形成嵌套的Tree结构。
  • 扩展名容错:使用pathinfo获取扩展名,并通过三元运算符处理没有扩展名的文件(此时$extension为空字符串)。

完成判断

函数执行完毕后,若路径无效则返回false;若路径有效,则返回包含所有(或经过滤后)文件的二维数组。可通过print_r(scan_dir('/path/to/dir', ['php']));进行调试查看。

简要总结

该函数简洁地解决了多层目录文件收集的需求,特别是在需要批量处理特定类型文件(如图片或脚本)时非常实用。结合array_filter或后续的数据格式化,可广泛应用于文件管理后台、爬虫抓取前的预处理等环节。

以上就是PHP递归获取目录内所有文件的实现方法的详细内容,更多关于PHP文件操作与递归算法的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表