【问题标题】:PHP's Iterator classPHP 的迭代器类
【发布时间】: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);——我会为此展开文档

标签: php iterator spl


【解决方案1】:

叶子是中的一个项目,它没有任何其他项目挂在它上面,即它是一个分支的末端。根据定义,文件符合此描述。

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

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

【讨论】:

  • awesome answer这是否意味着使用叶子模式时不需要RecursiveDirectoryIterator::SKIP_DOTS
  • 我想是这样,但我无法确认这一点。
  • 不包括空目录吗?
  • 空目录至少有 ... 条目。实际上,我不确定它如何与 SKIP_DOTS 指令一起使用。但总的来说,我认为目录总是有子目录,即使它们是空的。
  • RecursiveDirectoryIterator::hasChildren 的文档似乎证实了这一点:“返回当前条目是否为目录,但不是'。'或'..'"
猜你喜欢
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 2014-03-21
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多