
在 PHP 中,递归获取目录内所有文件是一个常见的需求。以下是实现方法的详细说明和代码示例:
1. 使用 RecursiveDirectoryIterator 和 RecursiveIteratorIterator
这是 PHP 内置的高效方式,适合处理大型目录结构。
代码示例
<?phpfunction getFilesRecursively($dir) {
    $files = [];
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
        RecursiveIteratorIterator::CHILD_FIRST
    );
    foreach ($iterator as $file) {
        if ($file->isFile()) {
            $files[] = $file->getPathname();
        }
    }
    return $files;}// 示例用法$dir = '/path/to/your/directory';$files = getFilesRecursively($dir);print_r($files);?>输出示例
Array ( [0] => /path/to/your/directory/file1.txt [1] => /path/to/your/directory/subdir/file2.jpg [2] => /path/to/your/directory/subdir/file3.php )
说明:
- RecursiveDirectoryIterator:递归遍历目录。
- RecursiveIteratorIterator:将递归迭代器扁平化。
- SKIP_DOTS:跳过- .和- ..目录。
- CHILD_FIRST:先遍历子目录,再遍历父目录。
2. 自定义递归函数
如果不想使用迭代器,可以通过自定义递归函数实现。
代码示例
<?phpfunction getFilesRecursively($dir) {
    $files = [];
    $items = scandir($dir);
    foreach ($items as $item) {
        if ($item === '.' || $item === '..') {
            continue;
        }
        $path = $dir . DIRECTORY_SEPARATOR . $item;
        if (is_dir($path)) {
            // 递归获取子目录文件
            $files = array_merge($files, getFilesRecursively($path));
        } else {
            $files[] = $path;
        }
    }
    return $files;}// 示例用法$dir = '/path/to/your/directory';$files = getFilesRecursively($dir);print_r($files);?>说明:
- scandir():获取目录下的所有文件和子目录。
- is_dir():判断是否为目录。
- array_merge():合并子目录的文件列表。
3. 使用 glob() 函数
glob() 函数可以匹配文件路径模式,结合递归实现文件遍历。
代码示例
<?phpfunction getFilesRecursively($dir) {
    $files = [];
    $items = glob($dir . '/*');
    foreach ($items as $item) {
        if (is_dir($item)) {
            $files = array_merge($files, getFilesRecursively($item));
        } else {
            $files[] = $item;
        }
    }
    return $files;}// 示例用法$dir = '/path/to/your/directory';$files = getFilesRecursively($dir);print_r($files);?>说明:
- glob():支持通配符匹配(如- *.txt)。
- 性能略低于迭代器方式,适合小型目录。 
4. 过滤特定文件类型
在递归过程中,可以过滤特定文件类型(如 .jpg 或 .php)。
代码示例
<?phpfunction getFilesRecursively($dir, $extensions = []) {
    $files = [];
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS)
    );
    foreach ($iterator as $file) {
        if ($file->isFile()) {
            if (empty($extensions) || in_array($file->getExtension(), $extensions)) {
                $files[] = $file->getPathname();
            }
        }
    }
    return $files;}// 示例用法:仅获取 .jpg 和 .png 文件$dir = '/path/to/your/directory';$files = getFilesRecursively($dir, ['jpg', 'png']);print_r($files);?>说明:
- getExtension():获取文件扩展名。
- in_array():检查文件扩展名是否在允许的列表中。
5. 性能优化建议
- 缓存结果:如果目录结构不常变化,可以将结果缓存到文件或内存中。 
- 限制深度:通过设置递归深度避免无限递归。 
- 异步处理:对于超大目录,可以使用异步任务处理。 
6. 总结
| 方法 | 优点 | 缺点 | 适用场景 | 
|---|---|---|---|
| RecursiveDirectoryIterator | 高效、内置支持 | 代码稍复杂 | 大型目录结构 | 
| 自定义递归函数 | 灵活、易理解 | 性能较低 | 小型目录或自定义逻辑 | 
| glob() | 简单、支持通配符 | 性能较低 | 小型目录或简单匹配 | 
| 过滤文件类型 | 可扩展性强 | 需要额外逻辑 | 需要特定文件类型的场景 | 
根据需求选择合适的方法,确保代码的可读性和性能。
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。


