Если мы можем предположить, что:
- порядок оценок в массиве всегда в порядке по имени игрока
а затем по номеру раунда
- количество раундов одинаково для каждого игрока
Затем, что мы можем сделать, это напечатать счет каждого игрока, когда мы двигались по массиву, вычисляя итоги в процессе, но сбрасывая его, если мы видим нового игрока:
$round_count = 0;
$header_printed = false;
$current_player = NULL;
$current_total = 0;
$current_output_line = "";
foreach ($scores as $score) {
// Check whether we have to move to a new player
if ($score->Player_Name != $current_player) {
// Check whether we have anything to print before
// resetting the variables
if (!is_null($current_player)) {
if (!$header_printed) {
printf("%-10s", "Player");
for ($i = 0; $i < $round_count; $i++) {
printf("%-10s", "Round $i");
}
printf("%-10s\n", "Total");
$header_printed = true;
}
$current_output_line .= sprintf("%5d\n", $current_total);
print $current_output_line;
}
// Reset the total and various variables for the new player
$round_count = 0;
$current_player = $score->Player_Name;
$current_total = 0;
$current_output_line = sprintf("%-10s", $score->Player_Name);
}
$round_count++;
$current_total += $score->Score;
$current_output_line .= sprintf("%5d ", $score->Score);
}
// The last player is not printed because we exited the loop
// before the print statement, so we need a print statement here.
if ($current_output_line != "") {
$current_output_line .= sprintf("%5d\n", $current_total);
print $current_output_line;
}
Пример вывода:
Player Round 0 Round 1 Total
Bob 10 7 17
Jack 6 12 18
Это должно быть достаточно эффективно, потому что он проходит через массив только один раз.