错误 - 无法遍历已关闭的生成器

时间:2016-07-05 03:36:30

标签: php arrays laravel

我今天遇到了这个错误,并且对如何处理它感到很失落。

我的应用程序正在从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);
    }
  }

任何想法都会有所帮助。

2 个答案:

答案 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) : [];