【问题标题】:add property to each object in PHP array为 PHP 数组中的每个对象添加属性
【发布时间】:2016-11-27 14:05:21
【问题描述】:

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

我想获取每个地址,发现与原点的距离(使用 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;
}

【问题讨论】:

    标签: php arrays laravel object eloquent


    【解决方案1】:

    您可以在 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);
    
    }
    

    【讨论】:

    • & 在 foreach 中不是必需的,它不会将参数传递给函数。即它可以在没有的情况下工作,所以:foreach ($addresses as $address)
    • 如果要修改项目,&确实是必须的。如果您不想在 foreach 循环中使用引用以及一些关于悬空引用的警告,我添加了一个替代方法。
    【解决方案2】:

    我认为您的工作存在更好的解决方案。

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

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

    这样调用google map api会减少。

    【讨论】:

      猜你喜欢
      • 2020-12-16
      • 2015-03-01
      • 1970-01-01
      • 2018-08-03
      • 2017-06-23
      • 2014-12-12
      • 1970-01-01
      • 2022-01-18
      • 2020-11-05
      相关资源
      最近更新 更多