加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 如何使用RecursiveIteratorIterator忽略目录?

发布时间:2020-12-13 17:44:31 所属栏目:PHP教程 来源:网络整理
导读:我已经尝试了几种方法来在文件系统上使用RecursiveIteratorIterator忽略某些目录. 为了举例说明我想忽略以下目录:/ cache. 我的迭代器看起来像这样: //$dirname is root$directory = new RecursiveDirectoryIterator($dirname);$mega = new RecursiveItera
我已经尝试了几种方法来在文件系统上使用RecursiveIteratorIterator忽略某些目录.

为了举例说明我想忽略以下目录:/ cache.

我的迭代器看起来像这样:

//$dirname is root
$directory = new RecursiveDirectoryIterator($dirname);
$mega = new RecursiveIteratorIterator($directory,RecursiveIteratorIterator::SELF_FIRST);

foreach ($mega as $fileinfo) {
 echo $fileinfo;
}

我已经能够使用pathinfo忽略某些文件扩展名,例如这有效:

$filetypes = array("jpg","png");
$filetype = pathinfo($fileinfo,PATHINFO_EXTENSION);

foreach ($mega as $fileinfo) {
    if (!in_array(strtolower($filetype),$filetypes)) {
    echo $fileinfo;
    }
}

当我使用PATHINFO_DIRNAME(在数组中使用相应的目录路径)尝试它时,它不起作用,没有错误,它只是不忽略目录.

我也试过使用FilterIterator无济于事,现在我想也许我应该使用RegexIterator.

使用RecursiveIteratorIterator忽略目录的最简单,最有效的方法是什么?

实验没有用.
使用PATHINFO_DIRNAME

$dirignore = array("cache","cache2");
$directory = new RecursiveDirectoryIterator($dirname);
$mega = new RecursiveIteratorIterator($directory,RecursiveIteratorIterator::SELF_FIRST);
$dirtype = pathinfo($fileinfo,PATHINFO_DIRNAME); 

if (!in_array($dirtype),$dirignore)) {
echo $fileinfo;  //no worky still echo directories
}

使用FilterIterator(不知道这是如何工作的)

class DirFilter extends FilterIterator
{
    public function accept()
    {
        //return parent::current() != "..cache";

       $file = $this->getInnerIterator()->current();
       if ($file != "..cache")
       return $file->getFilename();

      //also tried with same error as below
      //return !preg_match('/cache',$file->getFilename());
    }
}

$directory= new RecursiveDirectoryIterator($dirname);
$directory = new DirFilter($directory); 
$mega = new RecursiveIteratorIterator($directory,RecursiveIteratorIterator::SELF_FIRST);
// loop

Tis导致错误:需要RecursiveIterator或IteratorAggregate创建它的实例

解决方法

您的DirFilter想要扩展RecursiveFilterIterator,因为它与递归迭代器一起使用.不这样做是导致错误的原因.

class DirFilter extends RecursiveFilterIterator
{
    // …
}

下一步是弄清楚如何正确使用accept().它应该返回一个true或false值,它指示当前项应该包含(true)还是从迭代中排除(false).从accept()返回文件名不是您想要做的.

class DirFilter extends RecursiveFilterIterator
{
    public function accept()
    {
        $excludes = array("cache","cache2");
        return !($this->isDir() && in_array($this->getFilename(),$excludes));
    }
}

能够传入排除目录数组可能会很好.这需要更多的代码,但更可重用.

class DirFilter extends RecursiveFilterIterator
{
    protected $exclude;
    public function __construct($iterator,array $exclude)
    {
        parent::__construct($iterator);
        $this->exclude = $exclude;
    }
    public function accept()
    {
        return !($this->isDir() && in_array($this->getFilename(),$this->exclude));
    }
    public function getChildren()
    {
        return new DirFilter($this->getInnerIterator()->getChildren(),$this->exclude);
    }
}

然后可以使用此代码,如:

$directory = new RecursiveDirectoryIterator($dirname);
$filtered = new DirFilter($directory,$dirignore); 
$mega = new RecursiveIteratorIterator($filtered,…);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读