从包含分组集合的 Laravel 集合中获取每组特定列值的总和

问题描述 投票:0回答:2

我正在尝试按值对集合进行分组,并对每个嵌套集合中的列值求和。我正在从谷歌分析获取数据。

例如,当您查看 Safari(应用内)时,我只需要对嵌套集合中关键“会话”的所有值进行求和。

我该怎么做?

我唯一的想法是循环所有集合和总和值,但这似乎不是一个好主意。

最终,我想显示包含两列的表格:浏览器和会话

php laravel collections sum grouping
2个回答
2
投票

你可以尝试:

$result = $collection->map(function ($item, $key) {
    return [$key => $item->sum('sessions')];
});

0
投票

您的输入数据是一个集合,它似乎是

groupBy()
调用的结果。如果您只需要浏览器值及其相关会话值总和,那么关联数组是最紧密、最合理的结果结构。

省略

groupBy()
步骤并使用
reduce()
仅迭代有效负载一次可能会更高效。这将输出浏览器键入的会话总数的平面关联数组。

代码:(PHPize演示

var_export(
    $coll->reduce(
        function ($result, $row) {
            $result[$row['browser']] = ($result[$row['browser']] ?? 0) + $row['sessions'];
            return $result;
        }
    )
);

也许最简洁的方法是使用

map()
对每个组中的会话值进行迭代调用
sum()
。 (PHPize 演示)

var_export(
    $coll->groupBy('browser')
    ->map(fn($item) => $item->sum('sessions'))
    ->toArray((
);

另一种方法用

groupBy()
替换
mapToGroups()
,然后调用
map()
,这会迭代调用
sum()
,然后是
toArray()
。 (PHPize 演示)

var_export(
    $coll->mapToGroups(
        fn($row) => [$row['browser'] => $row['sessions']]
    )->map(fn($v) => $v->sum())
    ->toArray()
);
© www.soinside.com 2019 - 2024. All rights reserved.