【问题标题】:Return new collection without modifying original collection在不修改原始集合的情况下返回新集合
【发布时间】:2020-02-27 19:32:54
【问题描述】:

我有一个 Laravel 集合,我想将其属性值之一修改为负整数。为此,我使用集合 map 方法,但它也修改了原始集合。

我的代码:

$modified_revenue_data = $revenue_data->map(function ($item) {
    if ($item->is_claw_back == 1 && $item->claw_back_date != null) {
        return $item->revenue = $item->revenue * -1;
    }

    return $item;
});

我想将新集合存储到$modified_revenue_data$revenue_data 也被修改了。

在不修改原始集合的情况下正确的做法是什么?

【问题讨论】:

    标签: php laravel-5 collections eloquent


    【解决方案1】:

    它不应该更新原始集合。我进行了一些测试,可以确认这是map() 方法的行为:

    $a = collect([1, 2, 3, 4, 5]);
    
    $b = $a->map(function ($el) {
         return $el * 2; 
    });
    
    dd($b);
    
    => Illuminate\Support\Collection {#3726
         all: [
           2,
           4,
           6,
           8,
           10,
         ],
       }
    
    dd($a);
    
    => Illuminate\Support\Collection {#3743
         all: [
           1,
           2,
           3,
           4,
           5,
         ],
       }
    

    documentation 中也说明了这种行为:

    地图()

    ...

    与大多数其他集合方法一样,ma​​p 返回一个新集合 实例; 它不会修改调用它的集合。如果 要转换原始集合,请使用 transform() 方法。

    【讨论】:

    • 这是一个单维集合。我在多维集合中遇到问题,我只想更改其中一个属性。
    • @FahadShaikh 应该是一样的。映射的结果应该存储在新创建的集合中,而不是更改之前的集合。
    • @DanCantir 我不是 OP,我是 Fahad Shaikh。
    • @KennyHorna 哦,对不起,我的错!
    • @KennyHorna 您的收藏没有被修改。我不知道那为什么是我的?
    猜你喜欢
    • 2016-06-30
    • 2011-06-13
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 2017-01-31
    • 2013-07-28
    • 2015-08-03
    相关资源
    最近更新 更多