我想检索一个目录的所有子目录,但只检索那些深度为 2 的子目录。
到目前为止,我已经编写了这段代码,它运行得很好。
$directory="./test_dir";
$maxDepth=2;
$iterator = new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator(
$directory,
\FilesystemIterator::SKIP_DOTS
),
\RecursiveIteratorIterator::SELF_FIRST,
);
$iterator->setMaxDepth($maxDepth);
foreach ($iterator as $file) {
if($iterator->getDepth()===2){
echo $file->getPathname() . "\n";
}
}
但是,我想知道是否可以消除在 foreach 循环中进行测试的需要:
if($iterator->getDepth()===2){
...
}
当我实例化 $iterator 时,使用 RecursiveFilterIterator 直接过滤它。
我想我需要创建一个扩展
RecursiveFilterIterator
的类,并在accept
方法中定义一个条件,就像这个例子一样(php手册中的注释)。但是,我对如何做有点困惑继续或者如果可能的话。
我不知道是否可以使用 RecursiveFilterIterator 获取迭代器项的当前深度。在您的情况下,该项目将是一个 SplFileInfo 实例,它不知道有关其文件深度的任何信息。
您可以将目录迭代器包装在过滤器迭代器中:
$directory = './test_dir';
$depth = 2;
$iterator = new CallbackFilterIterator(
new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($directory, FilesystemIterator::SKIP_DOTS),
RecursiveIteratorIterator::SELF_FIRST,
),
fn(SplFileInfo $file, string $key, RecursiveIteratorIterator $it) => $it->getDepth() === $depth
);
foreach ($iterator as $file) {
echo $file->getPathname() . "\n";
}
我认为,如果第 3 级及以上级别存在大量子目录和文件,不设置
setMaxDepth
会使整个过程变慢。在这种情况下,设置它可能是有意义的:
$recursiveIteratorIterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($directory, FilesystemIterator::SKIP_DOTS),
RecursiveIteratorIterator::SELF_FIRST,
);
$recursiveIteratorIterator->setMaxDepth($depth);
$iterator = new CallbackFilterIterator(
$recursiveIteratorIterator,
fn(SplFileInfo $file, string $key, RecursiveIteratorIterator $it) => $it->getDepth() === $depth
);