2016-07-23 58 views
2

我的$addresses数组包含每个$client的多个位置。 这些地址是在Laravel中使用Eloquent关系获取的。将属性添加到PHP数组中的每个对象

我想获取每个地址,发现距离原点的距离(使用Google Maps API),然后将该距离添加回每个对象。

我可以遍历每个键并重新添加新数据,但有没有更简单的方法来读取邮编,获得距离并将其添加到每个?

$client = client::find($id); 
$addresses = $client->address()->get(); 

长篇大论的方法:

foreach ($addresses as $address) { 

      $newAddress= new \stdClass; 
      $newAddress->label = $address->label; //seems redundant 
      $newAddress->street= $address->street; //seems redundant 
      $newAddress->postcode = $address->postcode; //seems redundant 

      $newAddress->distance = (function to get distance) //this is the only new data 

      $newAddresses[] = $newAddress; 
} 

回答

3

可以使用符号&在你的foreach循环声明趁references的。

foreach ($addresses as &$address) { 

     $address->distance = (function to get distance); //this is the only new data 
} 

请注意,使用foreach循环引用之后,包含引用的变量将被晃来晃去的范围的其余部分。

在上面的例子中,任何稍后使用$ adresse变量仍然会引用$ addresses数组的最后一项。

您可以通过在循环后调用

unset($address); 

摆脱参考。

或者你可以用这个替代代替:

foreach($addresses as $key => $adress) { 

    $addresses[ $key]->distance = (function to get distance); 

} 
+0

这是完美的,谢谢! –

+0

'&'在foreach中不是必需的,它不会将参数传递给函数。即它不会工作,所以:'foreach($ address作为$地址)' –

+0

如果你想修改这个项目,&确实是必须的。 如果您不想在foreach循环中使用引用以及关于悬挂引用的一些警告,我添加了一个替代方法。 –

-1

我的事情更好的解决方案存在对你的工作。

您应该在模型中添加一些字段以节省距离。

,并为您的地址添加更新事件让距离时,你的模型更新

这样

,调用谷歌地图API将减少。