我今天遇到了这个错误,并且对如何处理它感到很失落。
我的应用程序正在从API获取数据并使用该数据,我查询我的数据库,获取所需数据,创建新值并将其发送回API以进行更新。
我已经完成了一些谷歌搜索,但仍然掌握了MVC和laravel,我读过的任何内容都无法使用我的代码:
// Create Connection
$client = new Name\App(
env('DOMAIN'),
env('API_KEY'),
env('PASSWORD'),
env('SECRET')
);
//Get data from API
$something = $client->getSomething('something');
// Make empty Array
$arr = [];
// loop through data from API and create array of required data
foreach ($something as $thing) {
$arr[] = array('colors' => $thing->color);
}
// query database for values found from API array
$eg = DB::table('table')
->select('eg','size', 'weight')
->whereIn('eg', $arr) // whereIn to query array
->get();
// create another blank array
$data = [];
// loop the above query
foreach ($eg as $type) {
// create json value to send back to api
// and update
$data[] = [
'mindfull' => [
'this' => $type->en,
'that' => $type->tva
]
];
}
// update API (this gives me the traverse generator error)
foreach ($something as $again) {
$client->put('link/' . $again->id, $data);
}
}
任何想法都会有所帮助。
答案 0 :(得分:0)
这会为您的算法添加另一个迭代,但我想这必须起作用:
替换
//Get data from API
$something = $client->getSomething('something');
与
//Get data from API
$something = []
foreach ($client->getSomething('something') as $thing)
$something []= $thing;
这样,原始生成器只迭代一次。之后,您将拥有包含数据的数组。
答案 1 :(得分:0)
就像下面提到的alepino回答中的评论者一样,在第一个foreach循环之前使用$something = $client->getSomething('something');
将$something = iterator_to_array($something);
转换为数组,从而解决了问问者的问题。
但是如果其他人在尝试在可能已耗尽的迭代器上使用iterator_to_array
时偶然发现“ 无法遍历已经关闭的生成器”,则为:
在PHP中,只能遍历生成的迭代器(通过调用包含yield
关键字的函数来创建),直到耗尽为止。精疲力尽后尝试从中获取元素会引发上述消息的异常。
要将可能耗尽的Iterator安全地转换为可能为空的数组,请使用
$a = $iter->valid() ? iterator_to_array($iter) : [];