我正在尝试按值对集合进行分组,并对每个嵌套集合中的列值求和。我正在从谷歌分析获取数据。
例如,当您查看 Safari(应用内)时,我只需要对嵌套集合中关键“会话”的所有值进行求和。
我该怎么做?
我唯一的想法是循环所有集合和总和值,但这似乎不是一个好主意。
最终,我想显示包含两列的表格:浏览器和会话
你可以尝试:
$result = $collection->map(function ($item, $key) {
return [$key => $item->sum('sessions')];
});
您的输入数据是一个集合,它似乎是
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()
);