PHP的Iterator类

时间:2012-01-11 12:35:33

标签: php iterator spl

我正在使用PHP的SPL递归迭代器,虽然我对它很困惑,但我正在学习。

我在一个项目中使用它们,我需要以递归方式获取所有文件并从结果中排除文件夹。我最初使用这种方法......

$directory = new RecursiveDirectoryIterator($path);
$iterator = new RecursiveIteratorIterator($directory,
                RecursiveIteratorIterator::CHILD_FIRST);

foreach ($iterator as $fileinfo) {    
    if ($fileinfo->isDir()) {
        //skip directories
        //continue;
    }else{
        // process files
    }
}

但是SO用户建议我使用这种方法,这样我就不需要在循环中使用isDir()方法...

$directory = new RecursiveDirectoryIterator($path,
                        RecursiveDirectoryIterator::SKIP_DOTS);
$iterator = new RecursiveIteratorIterator($directory,
                        RecursiveIteratorIterator::LEAVES_ONLY);

请注意,我在RecursiveDirectoryIterator::SKIP_DOTS构造函数中使用了RecursiveDirectoryIterator,该构造函数应该跳过文件夹或...

现在我很困惑,因为经过一些测试后,即使不使用RecursiveDirectoryIterator::SKIP_DOTS它似乎也没有显示它们,我使用的Windows可能就是这个原因,这些点只出现在Unix类型系统上吗?或者我对我错过的东西感到困惑?

同样使用RecursiveIteratorIterator::LEAVES_ONLY代替RecursiveIteratorIterator::CHILD_FIRST,它会阻止文件夹显示在我的结果中,这是我想要的但我不明白为什么?该文档没有关于此

的信息

1 个答案:

答案 0 :(得分:3)

leaf是中的一个项目,它没有任何其他项目挂起,即它是分支的结尾。根据定义,文件符合此描述。

-- folder
   |
   |- folder
   |  |
   |  |- file       <- a leaf
   |  |
   |  -- folder
   |     |
   |     -- file    <- another leaf
   |
   -- file          <- yet another leaf

通过将RecursiveIteratorIterator设置为“仅叶子”模式,它将跳过任何不是叶子的项目。