在PHP数组中为每个对象添加属性

5

我的$addresses数组包含每个$client的多个位置。这些地址是使用Laravel中的Eloquent关系获取的。

我想要获取每个地址,发现它们与起点之间的距离(使用谷歌地图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;
}
2个回答

5
你可以在foreach循环声明中使用符号&来利用引用
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);

}

& 在 foreach 中不是必须的,因为它不会将参数传递给函数。也就是说,在不使用 & 的情况下,foreach 循环同样可以工作:foreach ($addresses as $address) - Lee Kowalkowski
如果您想要修改项目,则“&”确实是必需的。我提供了一种替代方法,如果您不想在foreach循环中使用引用,同时还提醒了一些关于悬空引用的警告。 - Matt Musia

-1

我认为有一个更好的解决方案适用于你的工作。

你应该在你的模型中添加一些字段来保存距离。

并且为你的地址添加更新事件,以便在你的模型更新时获取距离。

这样,调用 Google 地图 API 的次数将会减少。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接