PHP的迭代器类

6

我正在使用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
    }
}

但是一个 Stack Overflow 的用户建议我使用这种方法,这样我就不需要在循环中使用 isDir() 方法了...

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

请注意,我在RecursiveDirectoryIterator构造函数中使用了RecursiveDirectoryIterator :: SKIP_DOTS,这应该跳过文件夹或..
现在我感到困惑,因为经过一些测试,即使不使用RecursiveDirectoryIterator :: SKIP_DOTS,它似乎也不显示它们,我正在使用Windows,这可能是原因吗?点只会在Unix类型的系统上出现吗?还是我太糊涂以至于错过了什么?
此外,通过使用RecursiveIteratorIterator :: LEAVES_ONLY而不是RecursiveIteratorIterator :: CHILD_FIRST,它将停止文件夹出现在我的结果中,这正是我想要的,但我不明白为什么?文档没有提供任何信息。

2
(附注)默认的迭代模式是“LEAVES_ONLY”,所以您只需要使用new RecursiveIteratorIterator($directory);即可-我将为此扩展文档。 - Gordon
1个回答

3

叶子是树中没有其他项目悬挂的项目,即它是分支的末尾。按照定义,文件符合这个描述。

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

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

这个精彩的回答是否意味着在使用叶子模式时不需要使用RecursiveDirectoryIterator::SKIP_DOTS - JasonDavis
我认为是这样,但我无法立即确认。 - deceze
那不会包括空目录吗? - Rob Agar
空目录至少有 ... 条目。实际上,我不确定这如何与 SKIP_DOTS 指令配合使用。但总的来说,即使它们为空,我认为目录始终都有子文件。 - deceze
这似乎得到了RecursiveDirectoryIterator::hasChildren文档的确认:“返回当前条目是否为目录,但不包括'.'或'..'” - deceze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接