Написал функцию генерирующую таблицу с заданными данными в массиве, но при изменении данных,а именно - ячеек, таблица отрисовывается не корректно.
$data = [
[
'text' => 'Текст красного цвета',
'cells' => '1,2,4,5',
'align' => 'center',
'valign' => 'middle',
'color' => 'f00',
'bgcolor' => '00f'
],
[
'text' => 'Текст зеллёного цвета',
'cells' => '8,9',
'align' => 'center',
'valign' => 'middle',
'color' => '008000',
'bgcolor' => 'fff'
],
];
render($data);
function render($input) {
$max_cell_index = 0;
$new = [];
foreach($input as $value) {
$cells = explode(',', $value['cells']);
// определяем максимальный индекс ячейки
if (max($cells) > $max_cell_index) {
$max_cell_index = max($cells);
}
// находим минимальный индекс каждого множества ячеек
$new[min($cells)] = $value;
// var_dump($value).'/n';die;
}
// определяем количество колонок
$columns = floor(sqrt($max_cell_index));
// определяем количество строк
$rows = ceil(sqrt($max_cell_index));
$cell_indexes = [];
foreach($new as $cell_index => &$value) {
$cells = explode(',', $value['cells']);
$value['colspan'] = 1;
$value['rowspan'] = 1;
// добавляем в массив информацию, какие ячейки объединять
foreach($cells as $cell) {
$cell_indexes[$cell] = $cell;
if ($cell != $cell_index) {
if ($cell - $cell_index + 1 <= $columns) {
if ($cell - $cell_index + 1 > $value['rowspan']) {
$value['colspan'] = $cell - $cell_index + 1;
}
} else {
if (($cell - $cell_index + 1)/$columns > $value['rowspan']) {
$value['rowspan'] = ceil(($cell - $cell_index + 1)/$columns);
}
}
}
}
}
unset($value);
// строим таблицу
$table = '<table>';
$cell_iterator = 1;
for ($row_index = 1; $row_index <= $rows; $row_index++) {
$table .= '<tr>';
for ($column_index = 1; $column_index <= $columns; $column_index++) {
if (!isset($cell_indexes[$cell_iterator])) {
$table .= '<td>' . $cell_iterator . '</td>';
}
elseif (isset($new[$cell_iterator])) {
$table .= '<td rowspan="' . $new[$cell_iterator]['rowspan'] . '" colspan="' . $new[$cell_iterator]['colspan']
. '" style="width: ' . 50*$new[$cell_iterator]['colspan'] . '; text-align: ' . $new[$cell_iterator]['align']
. '; vertical-alignment: ' . $new[$cell_iterator]['valign'] . '; color: #' . $new[$cell_iterator]['color']
.'; background: #' . $new[$cell_iterator]['bgcolor'] . ';">' . $new[$cell_iterator]['text'] . '</td>';
}
$cell_iterator++;
}
$table .= '</tr>';
}
$table .= '</table>';
echo $table;
}