Php 聚合数组并在详细信息旁边显示聚合结果

Php 聚合数组并在详细信息旁边显示聚合结果,php,arrays,oop,yii,Php,Arrays,Oop,Yii,我有一个$department变量,它是department类的一个实例 Department类有一个名为$employees的属性,该属性包含与该部门相关的employees实例数组(从数据库中检索) Employee类有一个名为$salary\u amount和$job\u type\u id的属性。$employees数组元素按$job\u type\u id排序 对于指定的部门,我将输出该部门的员工列表,如下所示: Employees for IT Department --------

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

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

Employee
类有一个名为
$salary\u amount
$job\u type\u id
的属性。
$employees
数组元素按
$job\u type\u id
排序

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

Employees for IT Department
----------------------------

<?php foreach($department->employees as $employee): ?>
  <?php echo $employee->name; ?>
  <?php echo $employee->salary_amount; ?>
<?php endforeach; ?>
当前方法

目前,
$employees
由一个SQL查询填充,按我想要的方式对结果排序。然后,我运行一个单独的SQL查询,使用来自的技术获取每个
$job\u type\u id
$salary
总和数组

但是,第二次查询的结果集存储在不同的变量
$subtotals
中。因此,我仍然有一个问题,就是如何有效地将总和显示在员工列表的“上下文”中

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

更新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循环。例如(为清楚起见,以下代码示例不会格式化输出,也会输出作业类型id而不是描述,因为问题中未显示该数据):


难道你不能在
0
处初始化一个变量,并在循环数据时执行
$var+=$employee->salary\u amount
?最后你会得到你想要的数量。另外,你应该多付约翰·Q·史密斯一点钱,如果他看到这一点,他会脸色发青的——像Q这样的中间首字母很酷的人肯定应该得到更多:-D@DaveRandom是的,我也这么想。可怜的家伙。我正在采用您建议的方法,使用
foreach
循环,但是,当试图找到相同
$job\u type\u id
组的结束和下一个开始的位置时,这似乎很笨拙,因此我可以输出中间的总数。我试图使用一堆
if语句
,但是代码变得很难看,不能正常工作。。所以我希望有一个更好的方法。我正试图想出一种方法,通过SQL
GROUP BY
来整洁地完成这项工作,但我想不出任何一种方法本身都有一点糟糕。如果您愿意,我将向您展示我可以想到的内容……在SQL中,我可以使用一个窗口聚合(OLAP)函数,但正如您所说,在检测页面上正确输出值的位置时,它仍然有点混乱。@DaveRandom我将在问题中添加我当前的代码,这样可以作为改进的基础。顺便说一下,打板球打得不错。
<?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++;
}

?>
    $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";
    }