You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

代码说明

  1. 分组处理:使用groupBy('referencia')将相同编号的条目归为一组,这比unique()更适合需要聚合求和的场景。
  2. 动态识别总计字段:通过过滤属性名,自动匹配所有t*_total格式的字段,无需硬编码处理11个字段,适配不同数量的总计列场景。
  3. 求和赋值:对每个总计字段调用sum()方法计算分组内的总和,覆盖到合并后的条目上。
  4. 保留基础字段:以分组内第一个条目为模板,保留referencia、descripcion等无需求和的公共字段(默认同组内这些字段值一致,若有不一致可根据需求调整)。

原代码问题分析

你之前的尝试存在两个核心问题:

  • 错误覆盖了referencia字段,将其替换为t1_total的求和值,破坏了原始标识。
  • 仅处理了t1_total一个字段,未适配动态数量的总计列,逻辑不通用。

内容的提问来源于stack exchange,提问作者Peisou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 12:50:25