在PHP中使用Foreach在IteratorAggregates中生成
我在PHP中有一个带有私有数组字段的类,通过遍历该数组并生成新值来实现IteratorAggregate在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
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]
也是有效的语法。