如何使用PHP5 RecursiveDirectoryIterator类以递归方式显示具有特定文件类型的文件夹和子文件夹

时间:2010-03-30 00:14:28

标签: php

您好我正在尝试使用FilterIterator上的扩展来获取RecursiveDirectoryIterator类,但由于某种原因它只在根目录上进行迭代。

我的代码就是这个。

    class fileTypeFilter extends FilterIterator
{
    public function __construct($path)
    {
        parent::__construct(new RecursiveDirectoryIterator($path));
    }  
    public function accept()
    {
        $file = $this->getInnerIterator()->current();
        return preg_match('/\.php/i', $file->getFilename());
    }    

}

$it = new RecursiveDirectoryIterator('./');
$it = new fileTypeFilter($it);

foreach ($it as $file)
{
    echo $file;
}

我的目录结构是这样的。

-Dir1
--file1.php
--file2.php
-Dir2
--file1.php

等等

但是正如我之前所说的,这个类并不是递归地迭代整个目录结构而只是查看根目录。

问题是,如何使用基本的RescursiveDirectoryIterator来显示文件夹,然后运行FilterIterator来仅显示那些directorys中的php文件?

干杯

1 个答案:

答案 0 :(得分:2)

FilterIterator应该通过其构造函数接受另一个迭代器。 为了实现自动递归,您需要使用RecursiveIteratorIterator迭代RecursiveIterator。你不需要,但如果你不这样做,那么调用hasChildren()和getChildren()等等的负担就在你身上。

这是一个样本。我没有在FileTypeFilterIterator的构造函数中接受任何参数,尽管如果你想能够改变正则表达式,这将是一个很好的补充。但是,否则,您不需要定义构造函数。

$it = new FileTypeFilterIterator (
    new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($path),
        RecursiveIteratorIterator::SELF_FIRST
    )
);


class FileTypeFilterIterator extends FilterIterator
{
    public function __construct(Iterator $iter)
    {
        parent::__construct($iter);
    }
    public function accept()
    {
        $file = $this->getInnerIterator()->current();
        return preg_match('/\.php/i', $file->getFilename());
    }

}
foreach($it as $name => $object){
    echo "$name\n";
}

顺便说一句,在这种情况下,您也可以使用RegexIterator而不是扩展FilterIterator。