微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

`continue` 关键字在迭代器模式中的实现

如何解决`continue` 关键字在迭代器模式中的实现

我发现 continue 功能只能通过递归在迭代器模式中实现。 问题当然是循环遍历数百万个应该继续的无效元素应该是超慢的或者永远堆栈溢出。

如何在迭代器模式中不使用递归实现continue关键字?

带递归的 PHP 代码

class TableIterator implements \Iterator
{
    private $row;
    private $fileLines;

    public function __construct()
    {
        $this->fileLines = [
            "1,2,3,4,5,6,7,8","my condition,9,10,11,12,13,14,15",16,17,18,19,20,21,22,23","24,25,26,27,28,29,30,31","32,33,34,35,36,37,my condition 2,38","39,40,41,42,43,44,45,46"
        ];
    }

    public function rewind(): void
    {
        reset($this->fileLines);
    }

    public function current(): array
    {
        return $this->row;
    }

    public function key(): int
    {
        return key($this->fileLines);
    }

    public function next(): void
    {
        next($this->fileLines);
    }

    public function valid(): bool
    {
        $this->row = explode(",",current($this->fileLines));

        if($this->row[0] === 'my condition')
            $this->continue(); // here is the recursion problem
        
        if($this->row[6] === 'my condition 2')
            return false;

        return true;
    }
    
    private function continue()
    {
        $this->next();
        $this->valid();
    }
}

foreach(new TableIterator() as $key => $value)
    print_r($value);

如果有 PHP解决方案或破解方法,我会很高兴。 谢谢。

解决方法

我想出了一些解决方法,但它仍然不是理想的解决方案!

问题可能是,是否有任何解决方案?

if($value === null) continue; 继续迭代。 注释它以获得空值并且仍然能够获得键。问题可能出在 null 是预期值时!

class TableIterator implements \Iterator
{
    private $row;
    private $fileLines;
    private $continue;

    public function __construct()
    {
        $this->fileLines = [
            "1,2,3,4,5,6,7,8","my condition,9,10,11,12,13,14,15",16,17,18,19,20,21,22,23","24,25,26,27,28,29,30,31","32,33,34,35,36,37,my condition 2,38","39,40,41,42,43,44,45,46"
        ];
    }

    public function rewind(): void
    {
        reset($this->fileLines);
    }

    public function current(): ?array
    {
        if($this->continue)
        {
            $this->continue = false;
            return null;
        }
        
        return $this->row;
    }

    public function key(): int
    {
        return key($this->fileLines);
    }

    public function next(): void
    {
        next($this->fileLines);
    }

    public function valid(): bool
    {
        $this->row = explode(",",current($this->fileLines));

        if($this->row[0] === 'my condition')
            $this->continue = true;
        
        if($this->row[6] === 'my condition 2')
            return false;

        return true;
    }
}

foreach(new TableIterator() as $key => $value)
{
    if($value === null) continue;
    var_dump($value);
}
,

这就是解决方案!

我不会在 2021 年打扰自己解释它。 如果您好奇,请浏览整个算法。

class TableIterator implements \Iterator
{
    private $row;
    private $fileLines;

    public function __construct()
    {
        $this->fileLines = [
            "my condition,"1,46"
        ];
    }

    public function rewind(): void
    {
        reset($this->fileLines);
        
        while($this->continue())
        {
            next($this->fileLines);
        }
    }

    public function current(): array
    {
        return $this->row;
    }

    public function key(): int
    {
        return key($this->fileLines);
    }

    public function next(): void
    {
        do {
            next($this->fileLines);
        }
        while($this->continue());
    }

    public function valid(): bool
    {
        if($this->row[6] === 'my condition 2')
            return false;

        return true;
    }
    
    private function continue()
    {
        $this->row = explode(",current($this->fileLines));
        
        return $this->row[0] === 'my condition' ? true : false;
    }
}

foreach(new TableIterator() as $key => $value)
{
    var_dump($value);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。