我有一个实现Iterator
的对象并包含 2 个数组:“entries”和“pages”。每当我循环遍历此对象时,我想修改条目数组,但我收到错误 An iterator cannot be used with foreach by reference
我看到它开始于 PHP 5.2 .
我的问题是,如何在使用 foreach
时使用 Iterator
类来更改循环对象的值?
我的代码:
//$flavors = instance of this class:
class PaginatedResultSet implements \Iterator {
private $position = 0;
public $entries = array();
public $pages = array();
//...Iterator methods...
}
//looping
//throws error here
foreach ($flavors as &$flavor) {
$flavor = $flavor->stdClassForApi();
}
这样做的原因是有时 $flavors
不是 我的类的一个实例,而只是一个简单的数组。我希望能够轻松地修改这个数组,而不管它是什么类型。
最佳答案
我刚刚尝试创建一个迭代器,它使用了:
public function ¤t() {
$element = &$this->array[$this->position];
return $element;
}
但是还是不行。
我能推荐的最好的方法是你实现 \ArrayAccess
,这将允许你这样做:
foreach ($flavors as $key => $flavor) {
$flavors[$key] = $flavor->stdClassForApi();
}
使用生成器:
根据对生成器的 Marks 注释进行更新,以下内容将允许您迭代结果而无需实现 \Iterator
或 \ArrayAccess
。
class PaginatedResultSet {
public $entries = array();
public function &iterate()
{
foreach ($this->entries as &$v) {
yield $v;
}
}
}
$flavors = new PaginatedResultSet(/* args */);
foreach ($flavors->iterate() as &$flavor) {
$flavor = $flavor->stdClassForApi();
}
这是 PHP 5.5 中可用的功能。
关于PHP 迭代器不能通过引用与 foreach 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29798586/