SPL イテレータを介してディレクトリを再帰的にスキャンする標準的な方法は次のとおりです。
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path),
RecursiveIteratorIterator::CHILD_FIRST
);
foreach ($files as $file) {
print $file->getPathname() . PHP_EOL;
}
構成可能な一連のフィルターを再帰的なファイル検索に適用したいと考えています。を使用しRecursiveDirectoryIterator
てディレクトリ構造をスキャンしています。
ディレクトリ構造に複数のフィルタを適用したいと考えています。
私のセットアップコード:
$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
で my を再インスタンス化しているかのよう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 でテストしましたが、違いはありません。何か案は?