Laravel集合合并相同referencia项并求和对应列的实现方案
Laravel集合合并:按referencia分组并求和总计字段
解决方案代码
基于你已经过滤出xtalla == 'X'的集合$filtered_collection,可以通过以下代码实现合并相同referencia的条目,并对所有t*_total字段动态求和:
use Illuminate\Support\Str; // Laravel版本低于8.x时需要导入 // 按referencia字段分组 $grouped = $filtered_collection->groupBy('referencia'); // 处理每个分组,合并条目并求和总计字段 $mergedCollection = $grouped->map(function ($group) { // 以分组内第一个条目为基础,保留非总计字段(如referencia、descripcion等) $mergedItem = $group->first(); // 动态识别所有t*_total格式的总计字段 $totalFieldKeys = collect($mergedItem)->filter(function ($value, $key) { return Str::startsWith($key, 't') && Str::endsWith($key, '_total'); })->keys(); // 对每个总计字段在分组内求和 foreach ($totalFieldKeys as $field) { $mergedItem->$field = $group->sum($field); } // 若需对其他字段(如importe)求和,可添加以下代码 // $mergedItem->importe = $group->sum('importe'); return $mergedItem; })->values(); // 重置集合键为连续索引 return $mergedCollection;
代码说明
- 分组处理:使用
groupBy('referencia')将相同编号的条目归为一组,这比unique()更适合需要聚合求和的场景。 - 动态识别总计字段:通过过滤属性名,自动匹配所有
t*_total格式的字段,无需硬编码处理11个字段,适配不同数量的总计列场景。 - 求和赋值:对每个总计字段调用
sum()方法计算分组内的总和,覆盖到合并后的条目上。 - 保留基础字段:以分组内第一个条目为模板,保留
referencia、descripcion等无需求和的公共字段(默认同组内这些字段值一致,若有不一致可根据需求调整)。
原代码问题分析
你之前的尝试存在两个核心问题:
- 错误覆盖了
referencia字段,将其替换为t1_total的求和值,破坏了原始标识。 - 仅处理了
t1_total一个字段,未适配动态数量的总计列,逻辑不通用。
内容的提问来源于stack exchange,提问作者Peisou
相关产品推荐
相关产品推荐

