ディレクトリ構造のフラットな繰り返しが必要な場合は、 RecursiveIteratorIterator によって駆動される RecursiveDirectoryIterator を組み合わせてみてください。これは、反復のスケルトンがどのように見えるかです:
$start_dir = '/some/path';
$rit = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator(
$start_dir,
FilesystemIterator::KEY_AS_PATHNAME |
FilesystemIterator::CURRENT_AS_FILEINFO |
FilesystemIterator::SKIP_DOTS
),
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($rit as $path => $fileinfo) {
$level = $rit->getDepth();
if ($fileinfo->isDir()) {
print "[{$level}] in dir:{$path}\n";
} else {
print "[{$level}] file: {$path}\n";
}
}
これは少し恐ろしく見えるかもしれませんが、実際には比較的単純です。
が大部分のRecursiveDirectoryIterator
作業を行いますが、それを繰り返すと、 aa simple で得られるように、選択したディレクトリのノードが得られますDirectoryIterator
。
ただし、インターフェイスを実装しているため、ループ内の「has child? recurse into ...」条件を使用しRecursiveIterator
て駆動し、保存できます。これが、フラットに見えるイテレータを返しますが、実際には子ノードに再帰します。を使用して、リーフ ノードのサブ反復がいつ開始されるかを検出できます。また、フル パス名を使用して、ディレクトリがどのように変化しているかを検出できます。RecursiveIteratorIterator
RecursiveIteratorIterator
getDepth