PHP 迭代器不能通过引用与 foreach 一起使用

标签 php arrays foreach

我有一个实现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 &current() {
    $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/

相关文章:

c++ - 我可以在 C++ 中有一个 ifstream 数组吗

php - 在嵌套 foreach 循环内使用 MySQL 查询的缓慢 Excel 报告 [Laravel 5.3]

php - MySQL 和 INT auto_increment 字段

php - 您如何更改您的应用程序在 heroku 平台中使用的 php 版本?

javascript - 原生数组Reduce实现问题

jquery - Jquery foreach 和 $(this) 出现问题,我无法引用一个元素

php - 将字符串中的多个空格替换为单个空格

c++ - 在二维数组中查找最小值和最大值?

php foreach循环来自2个表的mysql数据?

jsf - 在 JSF 中迭代,使用 for 每个循环渲染纯 HTML <div> 元素