1

クラスのインスタンスである$department変数があります。Department

Departmentクラスには、その部門に関連するインスタンスの配列を含むというプロパティがあり$employeesますEmployee(データベースから取得)。

このEmployeeクラスには、andというプロパティが$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クエリが入力されており、結果を希望どおりに並べ替えています。次に、別のSQLクエリを実行して、別の質問の手法を使用して、$salaryそれぞれの合計の配列を取得します。$job_type_id

ただし、この2番目のクエリの結果セットは別の変数に格納されます$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++;
}

?>
4

1 に答える 1

0

1 つのアプローチは、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";
    }
于 2012-07-11T23:12:56.263 に答える