PHP 递归目录迭代器

标签 php spl

所以我想显示整个目录和子目录。

根据 PHP 文档,

RecursiveDirectoryIterator 提供了一个用于递归迭代文件系统目录的接口(interface)

这是我的代码:

$it = new RecursiveDirectoryIterator("c:\php_win");

foreach ($it as $dir) {
    var_dump($dir->getFilename());
}

以上代码仅显示了一级目录,未显示所有子目录。

我知道我必须使用 RecursiveIteratorIterator 来获取所有子目录,但我只是不知道为什么我需要使用 RecursiveIteratorIterator 迭代器。

在文件系统目录上递归迭代”是什么意思?有任何网络链接可以解释为什么我们需要 IteratorIterator?

最佳答案

RecursiveDirectoryIterator 是一个实现 RecursiveIterator 接口(interface)的类。

RecursiveIteratorIterator 是一个实现 Iterator 接口(interface)的类。

通过foreach遍历它,它将获取一个实现RecursiveIterator的对象并对其进行递归遍历(树遍历),在PHP中不仅是倒带,获取当前、前进下一个并检查有效性还要检查子项是否存在,然后在内部迭代这些子项。

RecursiveIteratorIterator and RecursiveDirectoryIterator diagram

因此,RecursiveIteratorItertor 提供线性顺序的对象遍历,同时在具体的 RecursiveIterator 实现上执行树遍历。

因此,RecursiveDirectoryIterator 只是容器。您可以立即迭代它(例如使用 foreach),但线性顺序对象迭代不会执行树遍历。

这就是 RecursiveIteratorIterator 存在的原因,它提供了树遍历。

这正是您的情况:RecursiveDirectoryIterator 上的直接迭代仅进行线性对象遍历。只有 RecursiveIteratorIterator 知道如何对实现 RecursiveIterator 接口(interface)的对象进行树遍历。由于它本身实现了 Iterator 接口(interface),因此可以在树遍历上进行线性对象遍历。

另请参阅 my answer to How does RecursiveIteratorIterator works in php ,它涵盖了示例性的目录迭代器,以显示可能的不同树遍历模式。

关于PHP 递归目录迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12774647/

相关文章:

php - 通过 ArrayAccess 访问多维数组

php - DirectoryIterator 和 FileSystemIterator 的区别

php - SplFixedArray 的性能真的比数组好吗?

php - 如何在 PHP 中对数组和数据进行排序?

postgresql - 如何查找 EnterpriseDB 中加载了哪些语言?

php - PHP 函数 strtotime() 支持哪些日期格式?

php - 使用 Update CONCAT 将数据添加到数据库中已有的数据

php - Yii 选择使用自定义字段

php - 创建用户可以自定义的页眉/横幅

php - 该值在表中,但所选值为 NULL