【问题标题】:Yielding in IteratorAggregates with Foreach in PHP使用 PHP 中的 Foreach 在 IteratorAggregates 中生成
【发布时间】:2015-09-22 15:12:46
【问题描述】:

我在 PHP 中有一个带有私有数组字段的类,并通过遍历该数组并产生新值来实现 IteratorAggregate。

class Item implements IteratorAggregate{
    private static $items = array(
        'a' => array(1, 2);
        'b' => array(3, 4);
        'c' => array(5, 6);
    );

    public function getIterator() {
        return array_walk(Item::$items, function ($value, $key) {
            yield array('letter' => $key, 'number' => $value[0]);
        });
    }
}

然后我尝试将此类的新实例传递给foreach 子句:

foreach((new Item()) as $value){
     process($value);
}

但是,这失败得很惨:

致命错误:未捕获的异常“异常”和消息“对象” Item::getIterator() 返回的必须是可遍历的或 实现接口Iterator'

但是,据我了解,我的类是可遍历的,因为它实现了 IteratorAggregate。

关于我做错了什么有什么建议吗?我可以重写它以将产量转换为数组,但这并不能解释为什么我会收到我收到的错误。

【问题讨论】:

    标签: php foreach generator yield


    【解决方案1】:

    在您的代码中,yield 适用于闭包,而不适用于方法。这意味着传递给array_walk 的闭包是一个生成器,getIterator 现在只是一个返回值array_walk(它是一个数组)的普通方法。

    只需使用foreach 而不是array_walk

    class Item implements IteratorAggregate{
        private static $items = array(
            'a' => array(1, 2),
            'b' => array(3, 4),
            'c' => array(5, 6),
        );
    
        public function getIterator() {
            foreach (self::$items as $key => $value) {
                yield array('letter' => $key, 'number' => $value[0]);
            }
        }
    }
    

    【讨论】:

    • 也许有用的旁注:yield $key => $value[0]; 也是有效的语法。
    猜你喜欢
    • 2016-01-26
    • 2014-09-06
    • 2011-09-23
    • 2015-06-21
    • 1970-01-01
    • 2011-08-30
    • 2021-09-16
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多