2012-07-11 101 views
1

我有一个$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每个$job_type_id旁边的员工名单?

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查询填充,订购我多么希望的结果。然后,我使用another question中的一项技术运行单独的SQL查询,以获得每个$job_type_id的总计$salary的数组。

但是,第二个查询的结果集存储在另一个变量$subtotals中。因此,我仍然存在高效地让Sum-Total显示与雇员名单“in-context”的问题。

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

更新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

你就不能在一个初始化的变量'0'并在循环数据时执行'$ var + = $ employee-> salary_amount'?然后最后你会得到你想要的数额。附:你应该多付约翰·Q·史密斯,如果他看到了这一点,他就会青睐 - 那些像Q这样的中间初始值得肯定的人应该更多:-D – DaveRandom 2012-07-11 21:35:08

+0

@DaveRandom是的,我也这么认为。可怜的bug子手。我正在采用'foreach'循环的方法,但是当试图找到同一个'$ job_type_id'结束和下一个开始的组时,它似乎很笨拙,因此我可以输出中间的总数。我试图使用一堆'if语句',但代码变得很难看,并且不能正常工作..所以我希望有更好的方法。 – Turgs 2012-07-11 22:22:24

+0

我正在想办法用SQL'GROUP BY'完成整个工作,但我想不出任何本身没什么问题的东西。我会告诉你想我可以想到,如果你喜欢,虽然... – DaveRandom 2012-07-11 22:31:14

回答

0

一种方法是使用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"; 
    }