如何解决带有回调的自定义迭代器
对于我的项目,我有一个由存储库创建的DoctrineIterator。 该迭代器根据我的内部请求返回一个数组。
我需要
第二个迭代器的使用超出了我的范围,因此无法更新其返回的值。
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 举报,一经查实,本站将立刻删除。