【发布时间】:2016-06-11 08:23:43
【问题描述】:
我有以下非常简单的 RecursiveDirectoryIterator 代码:
$dir = new RecursiveDirectoryIterator('/Users/yivi/test/', RecursiveDirectoryIterator::KEY_AS_PATHNAME);
$iter = new RecursiveIteratorIterator($dir);
foreach ($iter as $item) {
if ($item->isDir()) {
echo $item->getPath() . "\n";
$countd ++;
} else {
$count++;
}
}
echo "$count files and $count directories";
但会产生以下输出:
/Users/yivi/Sites/test
/Users/yivi/Sites/test
/Users/yivi/Sites/test/01
/Users/yivi/Sites/test/01
/Users/yivi/Sites/test/02
/Users/yivi/Sites/test/02
/Users/yivi/Sites/test/03
/Users/yivi/Sites/test/03
/Users/yivi/Sites/test/03/ab
/Users/yivi/Sites/test/03/ab
/Users/yivi/Sites/test/03/cd
/Users/yivi/Sites/test/03/cd
40 files and 12 directories
当我退出循环时,我计算了每个目录两次(我得到了双重列表,$countd 是 12,而不是 6)。
为什么会这样?如何避免?
我尝试使用RecursiveDirectoryIterator::SKIP_DOTS 作为标志,但它会跳过所有目录(但会计算文件)。
(PHP 5.5)
【问题讨论】:
-
我个人不知道如何在课程的核心解决它,但要绕过它(如果你赶时间)输出到一个数组然后
array_unique() -
是的,我也可以想到其他快速修复,但主要是我想了解这种行为。还是谢谢!
-
是的,我听到了。我在迭代器中遇到了类似这样的奇怪行为,我只是快速而肮脏地修复它们,所以我也对如何在类级别修复这种特殊行为感兴趣。