Преобразовать массив для вывода в html таблицу, объединить ячейки с одинаковыми значениями. PHP
Прошу помощи с переборкой массива для дальнейшего вывода в html таблицу. Из БД выгружается вот такой массив, который выводится в таблицу.
Array (
[0] => Array (
[report_id] => 6573
[date] => 2020-12-28
[comment] => Отчет принят
)
[1] => Array (
[report_id] => 6580
[date] => 2020-12-29
[comment] => Отчет на проверке
)
[2] => Array (
[report_id] => 6825
[date] => 2020-12-30
[comment] => Отчет на проверке
)
[3] => Array (
[report_id] => 6658
[date] => 2020-12-31
[comment] => Отчет на проверке
)
[4] => Array (
[report_id] => 6828
[date] => 2021-01-02
[comment] => Отчет на проверке
)
[5] => Array (
[report_id] => 7509
[date] => 2021-01-03
[comment] => Отчет не принят
)
[6] => Array (
[report_id] => 7519
[date] => 2021-01-04
[comment] => На доработку
)
[7] => Array (
[report_id] => 7559
[date] => 2021-01-05
[comment] => На доработку
)
[8] => Array (
[report_id] => 7561
[date] => 2021-01-07
[comment] => Отчет на проверке
)
)
Нужно объединить одинаковые значения, идущие подряд, в последнем столбике [comment], чтобы привести таблицу вот к такому виду. Объединять нужно максимум 4 одинаковых значения. 5-ое одинаковое подряд значение не объединяется с предыдущими 4.

Понимаю, что мне нужно посчитать rowspan, но не могу сообразить как
Ответы (1 шт):
Логика такова: перебираем элементы, заглядываем вперед на 3 элемента если нет выхода за пределы, получаем дельту которая станет rowspan если это первая ячейка в группе выводим ее, если нет пропускаем ячейку, если rowspan == 1 тоже не выводим его.
<?php
$table = Array (
0 => Array (
"report_id" => 6573,
"date" => "2020-12-28",
"comment" => "Отчет принят"
),
1 => Array (
"report_id" => 6580,
"date" => "2020-12-29",
"comment" => "Отчет на проверке"
),
2 => Array (
"report_id" => 6825,
"date" => "2020-12-30",
"comment" => "Отчет на проверке"
),
3 => Array (
"report_id" => 6658,
"date" => "2020-12-31",
"comment" => "Отчет на проверке"
),
4 => Array (
"report_id" => 6828,
"date" => "2021-01-02",
"comment" => "Отчет на проверке"
),
5 => Array (
"report_id" => 7509,
"date" => "2021-01-03",
"comment" => "Отчет не принят"
),
6 => Array (
"report_id" => 7519,
"date" => "2021-01-04",
"comment" => "На доработку"
),
7 => Array (
"report_id" => 7559,
"date" => "2021-01-05",
"comment" => "На доработку"
),
8 => Array (
"report_id" => 7561,
"date" => "2021-01-07",
"comment" => "Отчет на проверке"
)
);
$last = count($table) - 1;
$rowSpanStart = 0;
$rowSpanEnd = -1;
?>
<table>
<?php
for ($i = 0; $i < count($table); $i++) {
if ($i >= $rowSpanEnd) {
$current = $table[$i]['comment'];
$rowSpanStart = $i;
$rowSpanEnd = $i + 1;
$next = 1;
$before = 1; // check if it's range
while ($next < 4) {
if ($before == $next && $i + $next < $last && $current == $table[$i + $next]['comment']) {
$rowSpanEnd += 1;
$before += 1;
}
$next +=1;
}
}
?>
<tr>
<td><?php echo $table[$i]['report_id'] ?></td>
<td><?php echo $table[$i]['date'] ?></td>
<?php
if ($i == $rowSpanStart && ($rowSpanEnd - $rowSpanStart > 1)) {
$size = $rowSpanEnd - $rowSpanStart;
?> <td rowspan="<?php echo $size ?>"><?php echo $table[$i]['comment'] ?></td>
<?php
} else if ($i == $rowSpanStart && ($rowSpanEnd - $rowSpanStart == 1)) {
?> <td><?php echo $table[$i]['comment'] ?></td>
<?php
}
?>
</tr>
<?php
}
?>
</table>
