【问题标题】:Laravel Collection Sum Multiple Columns in CollectionLaravel 集合对集合中的多列求和
【发布时间】:2019-03-30 07:42:38
【问题描述】:

我一直在阅读有关 Laravel 中的集合的信息。目前我知道如何使用它,但是我对sum() 函数有疑问。

根据文档,它可以这样使用:

collect([1, 2, 3, 4, 5])->sum();

还有这样的:

$collection = collect([
    ['name' => 'JavaScript: The Good Parts', 'pages' => 176],
    ['name' => 'JavaScript: The Definitive Guide', 'pages' => 1096],
]);

$collection->sum('pages');

这很好,我理解,但是现在我有一个包含嵌套对象的数组,我想知道如何在 laravel 中实现这样的功能:

$collection = collect([
    ['name' => 'JavaScript: The Good Parts', 'pages' => 176, 'price' => 100.00],
    ['name' => 'JavaScript: The Definitive Guide', 'pages' => price, 'pages' => 150.00],
]);

$collection->sum(['pages', 'prices']);

这显然会返回这样的数组:

[1272, 250]

或在这样的集合/对象上:

{"total_pages": 1272, "total_price": 250}

简而言之,我想知道如何汇总并返回 laravel 集合中多列的结果,而不是这样做两次:

$collection->sum('pages');
$collection->sum('price');

既然我认为这会导致集合上出现多个循环,还是我错了?

【问题讨论】:

  • 这是为了解决当前的问题,还是仅仅为了知识?我对人们的想法很感兴趣
  • 当前问题和知识。
  • 数组求和和数组访问有什么问题? IE。 $sums = $collection->sum(["pages", "prices"]); $pageSum = $sums[0]; $priceSum = $sums[1];?还是你说$collection->sum(["pages", "prices"]); 不起作用?
  • 我不知道这是可能的。
  • 您的问题听起来像是:"$collection->sum(['pages', 'prices']); 这显然会返回这样的数组...",但我明白了;不支持。跟进;手动循环/添加有什么问题?

标签: laravel laravel-5


【解决方案1】:

您需要使用pipe 方法将集合传递给回调。在回调中,您可以实现您想要做的事情。

$collection = collect([
    ['name' => 'JavaScript: The Good Parts', 'pages' => 176, 'price' => 100.00],
    ['name' => 'JavaScript: The Definitive Guide', 'pages' => 314, 'price' => 150.00]
]);

$result = $collection->pipe(function ($collection) {
  return collect([
    'total_pages' => $collection->sum('pages'),
    'total_price' => $collection->sum('price'),
  ]);
});

【讨论】:

  • 但是这不就是把书的总和加上价格的总和然后返回结果吗?
  • 你是对的。我误解了你原来的问题。我已经更新了我的答案来做你想做的事。
  • 哇太棒了,不知道我能做到这一点!谢谢,将阅读有关使用管道的更多信息!
  • 不知道为什么我和你的问题都被否决了。
  • 其他人过来并随机投了反对票。我赞成您的问题,将其恢复为 0。对我来说似乎是一个合理的问题,我认为其他人会发现它很有用,他们将来会在谷歌上搜索类似的东西。
【解决方案2】:

查看code behind the sum() function,我们可以看到内部$collection->reduce()用于收集数据。所以我们应该能够使用相同的代码来实现您正在寻找的内容:

return $collection->reduce(function ($result, $item) {
    if ($result === null) {
        $result = [
            'pages' => 0,
            'price' => 0,
        ];
    }

    $result['pages'] += $item['pages'];
    $result['price'] += $item['price'];

    return $result;
}, 0);

要从中获得更通用的解决方案,您还可以在您的服务提供商之一中的 Collection 类上创建一个宏:

Collection::macro('sumMultiple', function ($columns) {
    return $this->reduce(function ($result, $item) use ($columns) {
        if ($result === null) {
            foreach ($columns as $column) {
                $result[$column] = 0;
            }
        }

        foreach ($columns as $column) {
            $result[$column] += $item[$column];
        }

        return $result;
    }, 0);
});

然后您可以将新函数与$collection->sumMultiple(['pages', 'price']) 一起使用,您将收到类似['pages' => 123, 'price' => 234] 的结果。

请注意,sumMultiple 目前不支持嵌套数组(即无法使用点符号访问字段)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 2022-07-20
    • 2019-11-27
    • 2019-06-28
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    相关资源
    最近更新 更多