聚合数组并将聚合结果与详细信息一起显示


Aggregating an array and displaying the aggregation result alongside the detail

我有一个$department变量,它是Department类的一个实例。

Department类有一个名为$employees的属性,该属性包含与该部门相关的Employee实例的数组(从数据库中检索)。

Employee类具有称为$salary_amount$job_type_id的属性。CCD_ 9阵列元素按CCD_。

对于指定的部门,我输出该部门的员工列表,如下所示:

Employees for IT Department
----------------------------
<?php foreach($department->employees as $employee): ?>
  <?php echo $employee->name; ?>
  <?php echo $employee->salary_amount; ?>
<?php endforeach; ?>

操作$department->employees的有效方法是什么,这样我就可以在员工列表旁边显示每个$job_type_id$salary_amount总数

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查询,使用另一个问题中的技术为每个$job_type_id获取一个$salary总和数组。

然而,来自第二个查询的结果集存储在不同的变量$subtotals中。因此,我仍然有一个问题,那就是如何有效地将Sum Total与员工列表一起显示在"上下文"中。

我碰巧在使用Yii框架,但这可能无关紧要,除非我应该从完全不同的角度思考或处理这类问题?请在评论中告诉我。

更新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++;
}
?>

一种方法是使用while循环。例如(为了清楚起见,下面的代码示例没有格式化输出,而且它输出的是job_type_id,而不是描述,因为问题中没有显示该数据):

    $employees = $department->employees;
    $employee = current($employees);
    while($employee)
    {
        $job_type_id = $employee->job_type_id;
        $total_salary = 0;
        echo "## Job Type $job_type_id ##";
        while ($employee && $employee->job_type_id == $job_type_id)
        {
            echo $employee->name;
            echo $employee->salary_amount;
            $total_salary += $employee->salary_amount;
            $employee = next ($employees);
        }
        echo "-->Total Salary for Job Type $job_type_id: $total_salary";
    }