Sorry, this entry is only available in 日本語.
Tag Archives: yield
php でディレクトリ配下の全ファイルを逐次処理する方法
PHPを使ってディレクトリ配下の全ファイルを再帰的に処理する方法です。 イテレータを使います。
例えば全ファイルの絶対パスを出力するなら次のようにします。
1 2 3 4 5 6 7 |
$iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator(realpath('dir_path'))); foreach ($iterator as $fileInfo) { if ($fileInfo->isFile()) { echo $fileInfo->getPathname(), "n"; } } |
イテレーションする対象をファイルだけに絞ったものを作るのもありですね。 次のように yield
を使って関数を作ることもできます。
1 2 3 4 5 6 7 8 9 10 11 12 |
function allSubdirectoryAndFilesIterator($dirPath) { return new new RecursiveIteratorIterator( new RecursiveDirectoryIterator(realpath($dirPath))); } function allFiles($dirPath) { foreach (allSubDirectoryAndFiles('directory_path') as $fileInfo) { if ($fileInfo->isFile()) { yield $fileInfo; } } } |
でもこれは yield
を使っているため PHP 5.5 からしか使えません。 FilterIterator
を使えば PHP 5.1 から使える関数を作成できます。
1 2 3 4 5 6 7 8 9 |
class FileFilterIterator extends FilterIterator { function accept() { $fileInfo = $this->getInnerIterator()->current(); if ($fileInfo !== null || $fileInfo->isFile()) { return true; } return false; } } |
このように FileFilterIterator
を作り、 $iterator = new FileFilterIterator($anIterator);
のようにすれば、ファイルのみの Iterator が作れます。
「Iterator
なんて 言語の機能に依存しすぎだから readdir
つかって自分でイテレータ作るべきだ」というご意見もあります。