X-core
@X-core
начинающий веб разработчик

Как реализовать функцию генерирующую html таблицу по заданным значениям массива?

Написал функцию генерирующую таблицу с заданными данными в массиве, но при изменении данных,а именно - ячеек, таблица отрисовывается не корректно.
$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;

}
  • Вопрос задан
  • 104 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
01 мая 2024, в 00:29
2000 руб./за проект
01 мая 2024, в 00:20
15000 руб./за проект
30 апр. 2024, в 23:39
3000 руб./за проект