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

PHP Twig中如何对按名称分组的数组计算薪资总和

Twig同职位分组后计算组内总薪资实现方案

你可以直接在分组渲染阶段完成总薪资计算,不需要修改原有分组逻辑,同时修正现有代码中job_name变量未定义的问题。

兼容所有Twig版本的实现方式

在渲染每个分组的表头前,初始化总薪资为0,遍历当前分组下的所有职位条目累加薪资即可,完整修正后的代码如下:

{# 按职位名称分组逻辑,与原有逻辑一致 #}
{% for job in jobs %}
    {% if not attribute(output, job.getJobName()) is defined %}
        {% set output = output|merge({ (job.getJobName()) : {} }) %}
    {% endif %}                        
    {% set output = output|merge({(job.getJobName()) : output[job.getJobName()] | merge([job])}) %}
{% endfor %}

{% for group_title, items in output  %}
    {# 计算当前分组总薪资 #}
    {% set total_salary = 0 %}
    {% for item in items %}
        {% set total_salary = total_salary + item.getEmpSalary() %}
    {% endfor %}

    {# 分组表头行 #}
    <tr>
        <td>{{ group_title }}</td>
        <td></td>
        <td></td>
        <td></td>
        <td>Total Salary</td>
        <td>{{ total_salary }}</td>
    </tr>

    {# 组内员工明细行 #}
    {% for item in items %}
        {% if item %}
            <tr>
                <td>{{ item.getEmpName() }}</td>
                <td>{{ item.getEmpSalary() }}</td>
            </tr>
        {% endif %}
    {% endfor %}                        
{% endfor %}

简化写法(Twig 3.12及以上版本支持)

如果你的Twig版本满足要求,可以直接使用内置reduce过滤器省略累加循环,代码更简洁:

{# 替换上述代码中循环计算total_salary的部分 #}
{% set total_salary = items|reduce((carry, item) => carry + item.getEmpSalary(), 0) %}

优化建议

  • 优先推荐在后端控制器/数据处理层提前完成分组、总薪资计算,将结构化的分组结果直接传递给模板渲染,减少模板层的逻辑运算,可维护性和渲染性能都更好。
  • 如果薪资字段存在非数字值,需要在累加前做类型校验,避免计算报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:57:49