如何获取在PHP中具有特定的文件夹名称的所有子目录?(how to get all subdirec

2019-09-02 01:01发布

我发现,我可以得到该文件夹​​的所有子目录在PHP代码如下

$address = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::SELF_FIRST,
RecursiveIteratorIterator::CATCH_GET_CHILD // Ignore "Permission denied"
);

并把它放在$地址。

我怎样才能增加一个标准,说,如果有子目录里面的“TMP”的文件夹,然后将其放在$地址?

Answer 1:

你可以创建自己的RecursiveFilterIterator

$dir = new RecursiveDirectoryIterator(__DIR__, 
        RecursiveDirectoryIterator::SKIP_DOTS);

$address = new RecursiveIteratorIterator(new TmpRecursiveFilterIterator($dir), 
        RecursiveIteratorIterator::SELF_FIRST, 
        RecursiveIteratorIterator::CATCH_GET_CHILD);


foreach($address as $dir) {
    echo $dir,PHP_EOL;
}

类用于

class TmpRecursiveFilterIterator extends RecursiveFilterIterator {
    public function accept() {
        $file = $this->current();
        if ($file->isDir()) {
            return is_dir("$file/tmp");
        }
        return false;
    }
}


Answer 2:

你也许可以通过创建自己添加的标准FilterIterator ,用于检查一个子目录。 下面的用法示例演示了这种列出文件夹我有下饭桶。

$address是什么,你有你的问题已经,过滤器只是增加周围:

$filtered = new SubDirFilter($address, '.git');

foreach ($filtered as $file) {
    echo $filtered->getSubPathname(), "\n";
}

输出:

Artax
CgiHttpKernel
CgiHttpKernel/vendor/silex/silex
...
composer
composer-setup
CVBacklog
...

,什么不是。 使用此过滤器,迭代器是相对直线前进,为每个条目它检查是否有subdiretory与否。 重要的是,你有FilesystemIterator::SKIP_DOTS这个(你有)启用,否则你将得到重复的结果(表达相同的目录):

class SubDirFilter extends FilterIterator
{
    private $subDir;

    public function __construct(Iterator $iterator, $subDir) {
        $this->subDir = $subDir;
        parent::__construct($iterator);
    }

    public function accept() {
        return is_dir($this->current() . "/" . $this->subDir);
    }
}


文章来源: how to get all subdirectories that has specific folder name in php?