Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中使用Foreach在IteratorAggregates中生成_Php_Foreach_Generator_Yield - Fatal编程技术网

在PHP中使用Foreach在IteratorAggregates中生成

在PHP中使用Foreach在IteratorAggregates中生成,php,foreach,generator,yield,Php,Foreach,Generator,Yield,我在PHP中有一个带有私有数组字段的类,通过遍历该数组并生成新值来实现IteratorAggregate class Item implements IteratorAggregate{ private static $items = array( 'a' => array(1, 2); 'b' => array(3, 4); 'c' => array(5, 6); ); public function

我在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);
}
然而,这一点失败得很惨:

致命错误:未捕获异常“exception”,消息为“Objects” 由Item::getIterator()返回的必须是可遍历的或 实现接口迭代器的

然而,据我所知,我的类是可遍历的,因为它实现了IteratorAggregate


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

在您的代码中,
收益率应用于闭包,而不是方法。这意味着传递给
array\u walk
的闭包是一个生成器,
getIterator
现在只是一个普通方法,返回
array\u walk
的返回值(这是一个数组)

只需使用
foreach
而不是
array\u 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
应用于闭包,而不是方法。这意味着传递给
array\u walk
的闭包是一个生成器,
getIterator
现在只是一个普通方法,返回
array\u walk
的返回值(这是一个数组)

只需使用
foreach
而不是
array\u 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]
也是有效的语法。可能有用的旁注:
yield$key=>$value[0]
也是有效的语法。