我正在使用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
,它会阻止文件夹显示在我的结果中,这是我想要的但我不明白为什么?该文档没有关于此
答案 0 :(得分:3)
leaf是树中的一个项目,它没有任何其他项目挂起,即它是分支的结尾。根据定义,文件符合此描述。
-- folder
|
|- folder
| |
| |- file <- a leaf
| |
| -- folder
| |
| -- file <- another leaf
|
-- file <- yet another leaf
通过将RecursiveIteratorIterator
设置为“仅叶子”模式,它将跳过任何不是叶子的项目。