Преобразовать массив для вывода в 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 шт):

Автор решения: Daniil Loban

Логика такова: перебираем элементы, заглядываем вперед на 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>
→ Ссылка