Laravel用另一个集合的另一个值修改集合值

时间:2020-01-17 00:59:14

标签: json laravel collections

我有一个像这样的json文件,

{  
"unique_id_001":{
    "price_1":264000,
    "price_2":2178000,
    "price_3":3168000,
    "price_6":1089000,
    "price_7":3168000
},
"unique_id_002":{
    "price_1":264000,
    "price_2":2178000,
    "price_3":3168000,
    "price_6":1089000,
    "price_7":3168000
},
"unique_id_003":{
    "price_1":264000,
    "price_2":2178000,
    "price_3":3168000,
    "price_6":1089000,
    "price_7":3168000
}
}

我将其转换为集合,并希望将这些price_x设置为另一个集合。

public static function getOldPrices()
{
    $storagePath    = storage_path(self::PATH);
    $file           = File::get($storagePath);
    $data           = json_decode($file, true);
    $collection     = \App\Price::hydrate($data);
    $oldPrices      = $collection->flatten();

    return $oldPrices;
}

public static function all()
{
    $prices     = \App\Price::all();
    $old_prices = self::getOldPrices();

    foreach ($prices as $price) {
        foreach ($old_prices as $old_price) { // is there another way so I can remove this loop?
            if ($price->id === $old_price->id) {
                $price->price_1 = $old_price->price_1;
                $price->price_2 = $old_price->price_2;
                $price->price_3 = $old_price->price_3;
                $price->price_6 = $old_price->price_6;
                $price->price_7 = $old_price->price_7;
            }
        }
    }

    return $prices;
}

此代码有效,并且可能以$ prices更改每个价格的值。但是我想知道是否还有其他方法,因为我在这段代码中使用了两个foreach循环,我认为这样做不好。

1 个答案:

答案 0 :(得分:0)

我有另一种使用map()

的方法

这是我更新的代码

$prices = $prices->map(function ($price) use ($oldPrices) {
    if ($oldPrice = $oldPrices->firstWhere('id', $price->id)) {
        $price->price_1 = $oldPrice->price_1;
        $price->price_2 = $oldPrice->price_2;
        $price->price_3 = $oldPrice->price_3;
        $price->price_6 = $oldPrice->price_6;
        $price->price_7 = $oldPrice->price_7;
    }

    return $price;
});