您好我正在尝试使用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文件?
干杯
答案 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。