【发布时间】:2012-07-11 14:30:32
【问题描述】:
我有一个$department 变量,它是Department 类的一个实例。
Department 类有一个名为$employees 的属性,其中包含与该部门相关的Employee 实例数组(从数据库中检索)。
Employee 类有一个名为$salary_amount 和$job_type_id 的属性。 $employees 数组元素按$job_type_id 排序。
对于指定的部门,我正在输出该部门的员工列表,如下所示:
Employees for IT Department
----------------------------
<?php foreach($department->employees as $employee): ?>
<?php echo $employee->name; ?>
<?php echo $employee->salary_amount; ?>
<?php endforeach; ?>
什么是有效的操作方式 $department->employees 所以我可以显示 $salary_amount 每个 @987654336 的总和@除了员工名单吗?
Employees for IT Department
----------------------------
## Help Desk ##
Joseph Lazar
$47,000
John Q. Smith
$15,444
--> Total Salary for Help Desk: $62,444
## Database Administrator ##
Piet Pietersen
$55,120
Ivan Horvat
$63,750
--> Total Salary for Help Desk: $118,870
当前方法
目前,$employees 由单个 SQL 查询填充,按我想要的方式排序结果。然后,我运行一个单独的 SQL 查询,使用 another question 中的技术为每个 $job_type_id 获取一组 $salary sum-totals。
但是,第二个查询的结果集存储在不同的变量 $subtotals 中。因此,我仍然存在有效地让 Sum-Total 与员工列表“在上下文中”显示的问题。
我碰巧在使用Yii framework,但这可能无关紧要,除非我应该从完全不同的角度考虑或处理这类问题?请在 cmets 中告诉我。
更新 1
这是我正在使用的当前代码,但感觉很乱,好像有更好的方法。如上所述,聚合是由单独的 SQL 完成的,但我愿意接受替代方案。
<?php
$employee_key = 0;
$employees_count = sizeof($department->employees);
$type_sum_key = 0;
$current_type_in_focus = null;
$next_type_in_focus = null;
foreach($department->employees as $employee)
{
$current_type_in_focus = $employee->job_type_id;
$next_type_in_focus = (isset($department->employees[$employee_key+1])) ? $department->employees[$employee_key+1]->job_type_id : null;
# output individual employee data
echo $employee->name;
echo $employee->salary_amount;
# output aggregated total for job type
if ( $current_type_in_focus !== $next_type_in_focus || $employee_key+1 == $employees_count )
{
echo '--> Total Salary for ' . $employee->jobType->name . ': ' . $department->subtotals[$type_sum_key]->total;
$type_sum_key++;
}
$income_key++;
}
?>
【问题讨论】:
-
你不能在
0初始化一个变量并在循环数据时执行$var += $employee->salary_amount吗?然后最后你会得到你想要的数量。附:你应该多付给 John Q. Smith 一点钱,如果他看到这个,他会很生气 - 像 Q 这样的中间首字母很酷的人肯定应该得到更多:-D -
@DaveRandom 是的,我也这么认为。可怜的混蛋。我正在采用您建议的
foreach循环方法,但是在尝试查找相同$job_type_id的组结束和下一个开始的位置时似乎很笨拙,因此我可以输出中间的总数。我正在尝试使用一堆if-statements,但代码变得丑陋并且无法正常工作..所以我希望有更好的方法。 -
我正在想办法用 SQL
GROUP BY整齐地做到这一点,但我想不出任何本身并不讨厌的东西。如果你愿意,我会告诉你我能想到的…… -
在 SQL 中,我可以使用窗口聚合 (OLAP) 函数,但正如您所说,在尝试检测在页面上正确输出值的位置时仍然有点混乱。
-
@DaveRandom 我将把我当前的代码添加到问题中,这样就可以作为改进的基础。顺便说一句,在板球比赛中踢得很漂亮。