通过 SPL 迭代器递归扫描目录的标准方法是:
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path),
RecursiveIteratorIterator::CHILD_FIRST
);
foreach ($files as $file) {
print $file->getPathname() . PHP_EOL;
}
我想要一组可组合的过滤器应用于我的递归文件搜索。我正在使用 aRecursiveDirectoryIterator
来扫描目录结构。
我想对我的目录结构应用多个过滤器。
我的设置代码:
$filters = new FilterRuleset(
new RecursiveDirectoryIterator($path)
);
$filters->addFilter(new FilterLapsedDirs);
$filters->addFilter(new IncludeExtension('wav'));
$files = new RecursiveIteratorIterator(
$filters, RecursiveIteratorIterator::CHILD_FIRST
);
我想我可以通过使用规则集来应用 N 个过滤器:
class FilterRuleset extends RecursiveFilterIterator {
private $filters = array();
public function addFilter($filter) {
$this->filters[] = $filter;
}
public function accept() {
$file = $this->current();
foreach ($this->filters as $filter) {
if (!$filter->accept($file)) {
return false;
}
}
return true;
}
}
我设置的过滤没有按预期工作。当我检查过滤器时,FilterRuleset
它们会在第一次调用时填充,然后在后续调用中为空白。好像在内部RecursiveIteratorIterator
重新实例化我的FilterRuleset
.
public function accept() {
print_r($this->filters);
$file = $this->current();
foreach ($this->filters as $filter) {
if (!$filter->accept($file)) {
return false;
}
}
return true;
}
输出:
Array
(
[0] => FilterLapsedDirs Object
(
)
[1] => IncludeExtension Object
(
[ext:private] => wav
)
)
Array
(
)
Array
(
)
Array
(
)
Array
(
)
Array
(
)
Array
(
)
我使用的是 PHP 5.1.6,但在 5.4.14 上对其进行了测试,没有区别。有任何想法吗?