2012-10-08 64 views
2

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

据PHP文件,

的RecursiveDirectoryIterator提供一个接口,在文件系统的目录递归迭代

这里是我的代码:

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

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

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

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

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

+1

我的回答树观众http://stackoverflow.com/questions/10955523/need-iterator-advice-to-traverse-tre/10956275#10956275在它上面散落一点点光。 – goat

回答

2

RecursiveDirectoryIterator是实现RecursiveIterator接口的类。

RecursiveIteratorIterator是实现Iterator接口的类。

随着foreach穿越过它,它会实现RecursiveIterator对象和执行递归遍历(树遍历)就可以了,在这里PHP不仅快退,取现,未来推进和检查的有效性检查如果孩子存在,然后内部迭代这些孩子,也一样。

RecursiveIteratorIterator and RecursiveDirectoryIterator diagram

所以RecursiveIteratorItertor以线性顺序提供对象遍历在混凝土RecursiveIterator implementaion执行树遍历。因此,RecursiveDirectoryIterator只是容器。你可以直接迭代它(例如用foreach),但是线性顺序对象迭代不会执行树遍历。

这就是为什么RecursiveIteratorIterator是存在的,它提供了树的遍历。

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

见以及my answer to How does RecursiveIteratorIterator works in php,它涵盖了目录迭代器示范表明,可能是树的遍历方式的不同。

相关问题