【问题标题】:how to get all subdirectories that has specific folder name in php?如何在php中获取具有特定文件夹名称的所有子目录?
【发布时间】:2013-04-29 15:12:49
【问题描述】:

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

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

并将其放入 $address 中。

如何再添加一个条件并说明子目录中是否包含“tmp”文件夹,然后将其放入 $address 中?

【问题讨论】:

  • 澄清一下:你想要/path/to in address 还是/path/to/tmp. “put it in the $address”中的“it”有点模棱两可。
  • @wikinevis 的意思是 /path/to 无效,因为它在路径中有 tmp 吗?因为path/to/tmp 还显示path/to/ 中有文件夹.....可以用示例输出更新您的答案

标签: php directory subdirectory


【解决方案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;
    }
}

【讨论】:

  • +1 是完全正确的(如果甚至没有根据需要使它变得更小)。我对这个代码本身并不是 100% 好的,但我非常喜欢这种风格。首先,任何类型的FilterIterator 都可以,RecursiveFilterIterator 也可以。同样使用 PHP 的标准库 inside 中的函数,对象抽象(这里:is_dir)是完全有效的。特别是因为 SplFileInfo 是 Spl 的一部分,它是标准 Php 库 (SPL) 的化身。耶!那么我还能说什么好呢?可变用法!干得好,PHP 有 COW,所以只需使用像这里这样的变量和 $file。这一切都很好 +1!
【解决方案2】:

您可能可以通过为自己创建一个检查子目录的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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 2019-11-03
    相关资源
    最近更新 更多