2016-07-23 179 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將減少。