PHP 如何遍历目录
你可能在整理电脑文件时,会想批量找出某个文件夹里的所有图片;做网站时,也可能需要自动读取某个目录下的用户上传文档——这些需求用PHP就能轻松实现,核心就是“遍历目录”。简单说,它就是让程序按顺序把指定文件夹里的所有文件、子目录都“找出来”,就像你手动翻桌面文件夹,把每一个文件、每一个子文件夹都列出来一样。
最基础的方法:用scandir函数
这是PHP里最容易上手的遍历方式,就像你拿个小本子,直接把文件夹里的内容抄下来。举个生活化的例子:你有个叫“旅行照片”的文件夹,里面有“三亚.jpg”“青岛.png”和一个叫“海边”的子文件夹,用scandir就能把这些内容列出来。

代码写起来很简单,只要两步:第一步告诉PHP要读的文件夹路径;第二步把结果存成数组,方便你用。比如:
`php
// 遍历当前目录下的“旅行照片”文件夹
$dir = './旅行照片';
$files = scandir($dir);
print_r($files);
`
运行后你会发现,结果里多了两个奇怪的东西:.和..。这是系统自带的“当前目录”和“上级目录”的标记,就像文件夹里的“返回上一级”按钮,遍历的时候通常要把它们去掉,不然会把这两个标记也当成内容。
进阶遍历:处理子目录的递归方法
scandir只能遍历一层文件夹,如果你的“旅行照片”里还有子文件夹,比如“海边”里有“鼓浪屿.jpg”,用scandir就找不到了。这时候需要用“递归”——简单说,就是PHP自己调用自己,碰到子文件夹就再用一次遍历方法,直到把所有层级的内容都找完。
还是用刚才的例子:你要把“旅行照片”里所有的文件(包括子文件夹里的)都列出来,就可以写一个自定义的递归函数。比如:
`php
function scanAllFiles($dir) {
$result = [];
// 先获取当前目录的所有内容
$items = scandir($dir);
foreach ($items as $item) {
// 跳过系统自带的两个标记
if ($item == '.' || $item == '..') continue;
$path = $dir . '/' . $item;
// 如果是子文件夹,就递归调用自己
if (is_dir($path)) {
$result = array_merge($result, scanAllFiles($path));
} else {
// 如果是文件,就存到结果里
$result[] = $path;
}
}
return $result;
}
// 调用函数遍历“旅行照片”
$allFiles = scanAllFiles('./旅行照片');
print_r($allFiles);
`
这样运行后,你就能看到所有文件,包括子文件夹里的“鼓浪屿.jpg”了——就像你从“旅行照片”开始,一层一层翻,把每一个角落的文件都找出来。
注意几个实用小细节
实际用的时候,有几个小问题要避开:第一,路径要写对,如果你的PHP文件和“旅行照片”不在同一个文件夹,要写完整的路径,比如../files/旅行照片;第二,要确保PHP有读这个文件夹的权限,就像你不能随便翻别人加了密码的文件夹,PHP也需要对应权限才能读取目录;第三,要是只需要文件不要子目录,或者只要子目录不要文件,还可以加判断,比如用is_file()只保留文件,用is_dir()只保留子目录。
掌握这两种方法,不管是整理本地文件,还是做网站的文件管理功能,都能轻松实现。