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

带有回调的自定义迭代器

如何解决带有回调的自定义迭代器

对于我的项目,我有一个由存储库创建的DoctrineIterator。 该迭代器根据我的内部请求返回一个数组。

我需要

第二个迭代器的使用超出了我的范围,因此无法更新其返回的值。

我认为a可以创建一个带有回调的自定义迭代器来更新每个项目

class CallbackIterator extends \IteratorIterator
{
    private $callback;

    public function __construct(Traversable $iterator,callable $callback)
    {
        $this->callback = $callback;
        parent::__construct($iterator);
    }

    public function current()
    {
        return call_user_func($this->callback,parent::current());
    }
}

这似乎可行,但令我惊讶的是,没有in php这种迭代器

我可能走错了方向,我想念的是什么?

解决方法

是的,是的,您可以使用自定义迭代器(OuterIterator)并在内部迭代器上处理游标,但可以随便获取元素。

请参阅:

<?php

$arrayIterator = new \ArrayIterator([
    [
        'id'   => 1,'name' => 'John Smith',],[
        'id'   => 2,'name' => 'Julia Robin',]);

class CallableIterator implements \Iterator
{
    private \Iterator $innerIterator;
    private \Closure $callback;

    public function __construct(\Iterator $innerIterator,\Closure $callback)
    {
        $this->innerIterator = $innerIterator;
        $this->callback = $callback;
    }

    public function current()
    {
        $currentElement = $this->innerIterator->current();

        return \call_user_func($this->callback,$currentElement);
    }

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

    public function key()
    {
        return $this->innerIterator->key();
    }

    public function valid(): bool
    {
        return $this->innerIterator->valid();
    }

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


$myIterator = new CallableIterator($arrayIterator,static function (array $element) {
    $element['hash'] = \md5($element['name']);

    return $element;
});

print_r(\iterator_to_array($myIterator));

在此解决方案中,我们重写result元素,并基于名称的md5添加哈希。但是在这种情况下,您可以向可调用对象添加任何逻辑(创建新对象,删除特定元素,将新元素添加到数组等)。

Iterator在Doctrine实现Iterator界面中,因此您可以在遇到问题时使用此解决方案。

P.S。如果我们使用内部迭代器-迭代器中的最佳实践OuterIterator。因为许多系统都可以读取内部迭代器,所以您需要说出所有下一个代码:I am a parent iterator and can change inner result

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