【发布时间】:2012-02-07 19:31:58
【问题描述】:
我正在使用 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 构造函数中使用了 RecursiveDirectoryIterator::SKIP_DOTS,它应该跳过文件夹或 . 和 ..
现在我很困惑,因为经过一些测试,即使没有使用RecursiveDirectoryIterator::SKIP_DOTS,它似乎也没有显示它们,我使用的是 Windows 可能是这个原因,点只显示在 Unix 类型系统上吗?还是我很困惑以至于我错过了什么?
另外,通过使用RecursiveIteratorIterator::LEAVES_ONLY 而不是RecursiveIteratorIterator::CHILD_FIRST,它会阻止文件夹出现在我的结果中,这是我想要的,但我不明白为什么?文档没有这方面的信息
【问题讨论】:
-
(sidenote)默认的迭代模式是
LEAVES_ONLY,所以你需要做的就是new RecursiveIteratorIterator($directory);——我会为此展开文档