[原]RecursiveDirectoryIterator 递归目录迭代器

    PHP5开始支持了接口, 并且内置了Iterator接口, 所以如果你定义了一个类,并实现了Iterator接口,那么你的这个类对象就是ZEND_ITER_OBJECT,否则就是ZEND_ITER_PLAIN_OBJECT. 

    对于ZEND_ITER_PLAIN_OBJECT的类,foreach会通过HASH_OF获取该对象的默认属性数组,然后对该数组进行foreach.

    以上是PHP迭代器的一些描述。这里我们主要来看以下 RecursiveDirectoryIterator 这个迭代器的作用,这个东西其实还是比较有用的只是容易被大家忽略。他的主要作用就是实现递归目录扫描,返回目录中的内容。很多人一想到要扫描目录 然后就google一下,然后国内的文章基本都是粘来粘去,都一样的,用 dir  read scandir 之类的循环,并不是说不行或者不好,只是PHP给我们提供了一个更方便的方式。

    那就是 RecursiveDirectoryIterator 和 RecursiveIteratorIterator 了。他们同属于 SPL 的迭代器范围。

SPL,PHP 标准库(Standard PHP Library) ,此从 PHP 5.0 起内置的组件和接口,并且从 PHP5.3 已逐渐的成熟。SPL 其实在所有的 PHP5 开发环境中被内置,同时无需任何设置。SPL 还提供了其他非常多的迭代器  详见: 文档

    OK,我们继续回到扫描目录的问题。其实非常简单只是大家都不知道而已,没啥高深的东西,做个示例就OK了。

$filelist = array();
$it = new RecursiveDirectoryIterator($path); //给他文件夹路径,使用迭代器递归循环访问目录
foreach(new RecursiveIteratorIterator($it) as $name=>$file)  // 循环访问递归迭代器
{
    if ($file->getFilename() != '.' && $file->getFilename() != '..')
    {
        $temp = array();
        $temp['filename'] = $file->getFilename();  //文件名
        $temp['path'] = $file->getPath();  //文件路径
        $temp['ext'] = $file->getExtension(); // 文件后缀
        $filelist[] = $temp;
    }
}

具体的关于实例化后的文件对象都有哪些方法和都能取到哪些属性,具体参看  DirectoryIterator 中可以调用的方法,非常丰富。

关于 RecursiveIteratorIterator 接口的第二个参数要注意一下,我这里没有填写,默认是 RecursiveIteratorIterator::LEAVES_ONLY

作用是:递归文件夹取文件时跳过文件夹本身,只取文件夹下面的文件,输出的项全部是file(文件和各级子文件夹的文件)

RecursiveIteratorIterator::SELF_FIRST

各项都包含,例如递归文件夹就会连同子文件夹名称也作为其中项输出,顺序是先父后子

RecursiveIteratorIterator::CHILD_FIRST

同上,但顺序是先子后父,./test/test.php会在./test(文件夹)前面

最后一个是:RecursiveIteratorIterator::CATCH_GET_CHILD

跟 LEAVES_ONLY类似,也是只取子项,跳过键值(文件夹)。具体区别还不明确,望高人指点!!!!!