Прежде всего, вы можете прекратить выполнение 12 n запросов и получить всю информацию за один раз и с мощным механизмом агрегирования в MySQL:
SELECT
YEAR(created) as `Y`,
MONTH(created) AS `M`,
SUM(total) AS `SUM`
FROM
salesorder
WHERE
user_id = 7
GROUP BY
YEAR(created),
MONTH(created)
WITH ROLLUP
это приведет к такому результату:
Y | M | SUM
2011 | 10 | 20.00
2011 | 11 | 10.00
2011 | 12 | 5.00
2011 | NULL | 35.00 // M == NULL -> sum for this year
2012 | 1 | 7.00
2012 | 2 | 7.00
2012 | NULL | 14.00
NULL | NULL | 49.00 // M & Y == NULL -> sum for whole resultset
Таким образом, у вас будет сумма для отдельных месяцев в каждой строке, сумма для каждого года, если столбец M
равен нулю, и сумма для всего результата в последней строке (вы можете отменить его, если он вам не нужен)
Теперь вам нужно создать другой массив, который будет легче перебирать при добавлении строк в вашу таблицу. Я бы предложил, чтобы это выглядело так:
$tableRows = array(
0 => array( // 0 will be for sum from each year
2011 => 0,
2012 => 0
),
1 => array( // January
2011 => 0
...
);
Я не знаю, какой класс вы используете для взаимодействия с базой данных, поэтому позвольте мне предположить, что есть какой-то метод, который позволяет извлекать ассоциативный массив из набора результатов
$years = array();
while($dbRow = $res->fetchAssoc()){
$y = intval($dbRow['Y']);
if($y){
$m = intval($dbRow['M']);
$tableRow[$m][$y] = $dbRow['SUM'];
}
}
$allYears = array_keys($tableRows[0]); // get all years we have
Наконец, вы можете представить его в своей таблице:
<table>
<thead>
<tr>
<th>Month</th>
<?php foreach($allYears as $year): ?>
<th><?=$year?></th>
<?php endforeach; ?>
</tr>
<thead>
<tfoot>
<? foreach($tableRows as $month => $years): ?>
<tr>
<td><?=$month?></td>
<?php foreach($allYears as $y): ?>
<td><?=$years[$y]?></td>
<?php endforeach;
if(!$month): ?>
</tr>
</tfoot>
<tbody>
<?php else: ?>
</tr>
<?php endif;
endforeach; ?>
</tbody>
</table>
Что нужно исправить, так это отобразить название месяца и Total
вместо цифр в первом столбце