【问题标题】:Group by one column and sum another column in a Laravel collection按一列分组并对 Laravel 集合中的另一列求和
【发布时间】:2020-03-12 17:27:14
【问题描述】:

我是 PHP 和 Laravel 的新手,我被赋予了这个任务: 我有一个如下所示的集合:

   Illuminate\Support\Collection Object
(
    [items:protected] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 1
                    [cardId] => 100
                    [cardQuantity] => 1234      
                )

            [1] => stdClass Object
                (
                    [id] => 2
                    [cardId] => 100
                    [cardQuantity] => 1234            
                )

            [2] => stdClass Object
                (
                    [id] => 7
                    [cardId] => 200
                    [cardQuantity] => 1234   
                )

            [3] => stdClass Object
                        (
                    [id] => 8
                    [cardId] => 200
                    [cardQuantity] => 1234   
                )   
        )

)

我必须根据 cardId 参数过滤每个元素,添加 (+) cardQuantity 参数,然后返回新的、不同的数组,如下所示:

  (
     [id] => 10
     [cardId] => 100
     [cardQuantity] => 2468      
  )
  (
     [id] => 11
     [cardId] => 200
     [cardQuantity] => 2468      
  )

如何才能做到这一点?

【问题讨论】:

    标签: php laravel collections sum grouping


    【解决方案1】:

    您可以对如何实现这一目标有一个设想:

    $collection = collect([
        ['id' => 1, 'cardId' => 100, 'cardQuantity' => 1234],
        ['id' => 2, 'cardId' => 100, 'cardQuantity' => 1234],
        ['id' => 7, 'cardId' => 200, 'cardQuantity' => 1234],
        ['id' => 8, 'cardId' => 200, 'cardQuantity' => 1234],
    ]);
    
    $unique = $collection->unique('cardId'); // returns a collection
    
    $unique->transform(function ($item, $key) use ($collection) {
        $id = $item['cardId'];
    
        $item['cardQuantity'] = $collection->sum(function ($product) use ($id) {
            if($product['cardId'] == $id){
                return $product['cardQuantity'];
            }
        });
        return $item;
    });
    return $unique->all();
    

    此代码返回的结果是转换后的唯一集合:

    {
        "0": {
            "id": 1,
            "cardId": 100,
            "cardQuantity": 2468
        },
        "2": {
            "id": 7,
            "cardId": 200,
            "cardQuantity": 2468
        }
    }
    

    基本上,首先我们通过cardId 键获得唯一值,然后我们将transform unique 集合设置它的新值(唯一值的总和)。你可以玩和测试更多的方法来做到这一点。希望你能发现这很有用。

    【讨论】:

    • 您好先生,非常感谢您为我指明了正确的方向!我会玩弄你的答案,我会阅读更多关于 Laravel 收集方法的内容。
    猜你喜欢
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    相关资源
    最近更新 更多