如何在php中获取具有特定文件夹名称的所有子目录?

时间:2013-05-05 20:49:59

标签: php directory subdirectory

我发现我可以使用php中的以下代码获取该文件夹的所有子目录

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

并将其放入$地址。

如何添加另一个条件并说明子目录中是否包含'tmp'文件夹,然后将其放在$地址中?

2 个答案:

答案 0 :(得分:4)

您可以创建自己的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;
    }
}

答案 1 :(得分:3)

您可以通过创建一个检查子目录的FilterIterator来添加条件。以下用法示例演示了如何列出我在git下的文件夹。

$address就是你的问题,过滤器只是添加了:

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

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

输出:

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

什么不是。使用的过滤器迭代器相对简单,对于每个条目,检查它是否具有该子目录。重要的是你为此启用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);
    }
}