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
相关产品推荐
相关产品推荐

