如何合并两个Laravel集合并按同名字段累加对应属性值
Laravel集合按name字段匹配累加score实现方案
实现代码
use Illuminate\Support\Collection; // 初始化两个集合,若你已有对应集合实例可跳过该步骤 $collection1 = collect([ ['name' => 'aaa', 'score' => 10], ['name' => 'bbb', 'score' => 20], ]); $collection2 = collect([ ['name' => 'aaa', 'score' => 30], ['name' => 'bbb', 'score' => 10], ]); $collection3 = $collection1 // 拼接两个集合所有元素,替代merge避免出现同索引元素覆盖的问题 ->concat($collection2) // 按name字段分组,相同name的元素会被归到同一分组 ->groupBy('name') // 遍历每个分组计算score累加值,重组为目标结构 ->map(function (Collection $group) { return [ 'name' => $group->first()['name'], 'score' => $group->sum('score') ]; }) // 重置为连续数字索引,得到和需求一致的结构 ->values();
补充说明
- 若你的集合元素是对象格式,只需将
$group->first()['name']修改为$group->first()->name即可,sum('score')方法同时支持数组和对象格式的元素字段求和 - 该方案也支持两个集合存在不对称name的场景,比如$collection1存在name为ccc的元素、$collection2不存在,也会自动统计对应的score值
内容的提问来源于stack exchange,提问作者Rachid L'harime
相关产品推荐
相关产品推荐

