PHP,RecursiveIterator迭代器,深度仅2

问题描述 投票:0回答:1

我想检索一个目录的所有子目录,但只检索那些深度为 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手册中的注释)。但是,我对如何做有点困惑继续或者如果可能的话。

php subdirectory depth recursiveiterator
1个回答
0
投票

我不知道是否可以使用 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
);
© www.soinside.com 2019 - 2024. All rights reserved.