PHP实现递归获取目录内所有文件(含扩展名过滤)
在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文件操作与递归算法的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









