PHP RecursiveDirectoryIterator

时间:2012-10-08 02:30:47

标签: php spl

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

根据PHP Doc,

RecursiveDirectoryIterator提供了一个用于递归遍历文件系统目录的接口

这是我的代码:

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

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

上面的代码只显示了一个级别目录,所有子目录都没有显示。

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

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

2 个答案:

答案 0 :(得分:2)

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

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

通过一个foreach遍历过它,这将需要执行的对象RecursiveIterator,并在其上执行递归遍历(树的遍历),这里在PHP不仅倒带,取电流,接下来前进和检查有效性,但检查子项是否存在,然后在内部迭代这些子项。

RecursiveIteratorIterator and RecursiveDirectoryIterator diagram

因此RecursiveIteratorItertor以线性顺序提供对象遍历,而通过具体的RecursiveIterator实现执行树遍历。

所以RecursiveDirectoryIterator只是容器。您可以直接迭代它(例如使用foreach),但线性顺序对象迭代不会进行树遍历。

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

这正是您的情况:直接迭代RecursiveDirectoryIterator只进行线性对象遍历。只有RecursiveIteratorIterator知道如何在实现RecursiveIterator接口的对象上进行树遍历。当它实现Iterator接口本身时,就可以在树遍历上进行线性对象遍历。

同样参见my answer to How does RecursiveIteratorIterator works in php,它涵盖了迭代器的示例,以示出可能的树遍历的不同模式。

答案 1 :(得分:0)

我已经变成了一个类(RecursiveDirectoryIterator),它可以读取包含其所有子节点的目录并输出JSON或只是一个数组。

https://gist.github.com/jonataswalker/3c0c6b26eabb2e36bc90

输出的树查看器

http://codebeautify.org/jsonviewer/067c13