Функция которая генерирует html страницу

123
23 февраля 2021, 23:20

Нужно создать функцию которая генерирует Html страницу. На вход функции подается двумерный массив следующего вида:

$styles = array(
        array(
            'text' => 'Текст занимающий 1, 2, 4 и 5 колонку который находиться по центру'
        , 'cells' => '1,2,4,5'
        , 'align' => 'center'
        , 'valign' => 'center'
        , 'color' => 'FF0000'
        , 'bgcolor' => '0099FF'
        ),
        array(
            'text' => 'Текст зеленого цвета в колонке 8 и 9'
        , 'cells' => '8,9'
        , 'align' => 'right'
        , 'valign' => 'bottom'
        , 'color' => '00FF00'
        , 'bgcolor' => 'FFFFFF')
    );

номера занимаемых ячеек числа от 1 до 9, определяющих ячейку в таблице. Результатом функции должна быть HTML страница, в которой текст занимает соответствующие позиции с соответствующим вырыванием и цветом фона.

Вот моя функция.

<?php
function itera($r, $c, $w, $h, $bg, $col, $al, $val)
{
    $styles = array(
        array(
            'text' => 'Текст красного цвета в колонках 1, 2 4 и 5'
        , 'cells' => '1,2,4,5'
        , 'align' => 'center'
        , 'valign' => 'center'
        , 'color' => 'FF0000'
        , 'bgcolor' => '0099FF'
        ),
        array(
            'text' => 'Текст зеленого цвета'
        , 'cells' => '8,9'
        , 'align' => 'right'
        , 'valign' => 'bottom'
        , 'color' => '00FF00'
        , 'bgcolor' => 'FFFFFF')
    );
//    var_dump( $styles[]['text']);die;
//    var_dump($styles);die;
    $number = 0;
    echo('<table width="' . $w . '" height="' . $h . '" background-color="' . $bg . '" color="' . $col . '" align="' . $al . '" valign="' . $val . '" border="1">');
    for ($i = 1; $i <= $r; $i++) {
        echo('<tr>');
        for ($a = 1; $a <= $c; $a++) {
            $number++;
            foreach ($styles as $key => $val) {
                $td = '<td colspan="2"  style="color:' .$val['color']. '" bgcolor="'. $val['bgcolor'] .'" valign="' .$val['valign']. '" align="' .$val['align'] . '" >' . $number . $val['text'] . '</td>';
            }
            echo($td);
        }
        echo('</tr>');
    }
    echo('</table>');
}
itera(3, 3, 300, 300, 'red', 'FF0000', 'left', 'center');
?>

Она работает не корректно, нужно чтобы таблица изменялась с помощью параметров взятых из массива, т.е. ячейкам задавались разные стили по номерам. Исходя из тех данных у нас должно получиться 1, 2, 4 и 5, эти ячейки должны объединиться, окраситься в синий фон и текст в них должен быть по середине и красного цвета. А второй массив должен объединить 8 и 9 ячейку и покраситься в белый фон и тест должен быть зеленого цвета. Функция сейчас берет значения из последнего массива, а не из каждого, и плюс не обедняет ячейки.
Вот такой результат должен быть при данных в массиве.

Answer 1

Вот.

<?php
$arr = array(
    array(
        'text' => "Текст красного цвета",
        'cells' => '1,2,4,5',
        'align' => 'center',
        'valign' => 'center',
        'color' => '#FF0000',
        'bgcolor' => '#0000FF'
    ),
    array(
        'text' => "Текст зеленого цвета",
        'cells' => '8,9',
        'align' => 'right',
        'valign' => 'bottom',
        'color' => '#00FF00',
        'bgcolor' => '#FFFFFF'
    ),
);
function getTable(array $arr){
// Создаю массив из номеров ячеек  которые ввел пользователь в массивв $arr под
// ключем cells и тутже его сортирую в порядке возрастания
for ($i = 0; $i < count($arr); $i++) {
    $delimiter = ',';
    $arr_cells[] = explode($delimiter, $arr[$i]['cells']);
    sort($arr_cells[$i]);
}
// КОНЕЦ Создания массива из номеров, которые ввел пользователь
$size = 3; // Размер Таблицы = $size*$size.
//МОЖНО выбирать любой размер матрицы.
static $k = 1;
//Под каждый элемент создаю отдельный массив
$colspan = array();
$rowspan = array();
$width = array();
$height = array();
$class = array();
$color = array();
$bgcolor = array();
$text = array();
//Заполняю тадлицу данными по умолчанию
for ($i = 1; $i <= $size * $size; $i++) {
    $width[] = '100';
    $height[] = '100';
    $colspan[] = '1';
    $rowspan[] = '1';
    $text[] = $i;
}
//Основной код программы
for ($i = 0; $i < count($arr_cells); $i++) {
    //запоминая для каждой группы ячеек нужные данные
    $color[$arr_cells[$i][0] - 1] = $arr[$i]['color'];
    $bgcolor[$arr_cells[$i][0] - 1] = $arr[$i]['bgcolor'];
    $text[$arr_cells[$i][0] - 1] = $arr[$i]['text'];
    $align[$arr_cells[$i][0] - 1] = $arr[$i]['align'];
    $valign[$arr_cells[$i][0] - 1] = $arr[$i]['valign'];
    $count = count($arr_cells[$i]);
    $row = 1;
    for ($s = $count - 2, $j = 1; $j < $count, $s >= 0; $j++, $s--) {
        $class[$arr_cells[$i][$j] - 1] = 'hidden';// для ненужных мне ячеек присваиваю класс
        //Устанавливаю число ячеек, которые должны быть объединены по вертикали.
        if (($arr_cells[$i][$count - $j] - $arr_cells[$i][$s]) != 1) {
            $row++;
        }
    }
    $col = $count / $row;//Устанавливаю число ячеек, которые должны быть объединены по горизонтали
    $colspan[$arr_cells[$i][0] - 1] = $col;
    $rowspan[$arr_cells[$i][0] - 1] = $row;
    // Проверка того если номера ячеек идут подряд
    for ($l = 1; $l < $count; $l++) {
        if ((max($arr_cells[$i]) - min($arr_cells[$i])) == $l * $size - 1) {
            $rowspan[$arr_cells[$i][0] - 1] = $count / $size;
            $colspan[$arr_cells[$i][0] - 1] = $size;
        }
    }
    // КОНЕЦ Проверки того если номера ячеек идут подряд
}
//КОНЕЦ Основного кода программы
?>

<div class=" container-fluid">
    <div class=" row">
        <div class=" col-lg-<?php echo $size ?>">
            <table class="table table-bordered">
                <?php for ($i = 0; $i < $size; $i++) {
                    ?>
                    <tr>
                        <?php for ($j = 0; $j < $size; $j++, $k++) { ?>
                            <td colspan="<?php echo $colspan[$k - 1] ?>"
                                rowspan="<?php echo $rowspan[$k - 1] ?>"
                                class="<?php echo $class[$k - 1] ?>"
                                style="
                                        width: <?php echo $colspan[$k - 1] * $width[$k - 1] . 'px'; ?>;
                                        height: <?php echo $rowspan[$k - 1] * $height[$k - 1] . 'px'; ?>;
                                        background: <?php echo $bgcolor[$k - 1] ?>;
                                        color: <?php echo $color[$k - 1] ?>;
                                        text-align: <?php echo $align[$k - 1] ?>;
                                        vertical-align: <?php echo $valign[$k - 1] ?>;
                                        ">
                                <?php echo $text[$k - 1]; ?></td>
                        <?php } ?>
                    </tr>
                <?php } ?>
            </table>
        </div>
    </div>
</div>
<?php } ?><!--КОНЕЦ тела функции getTable-->
<?php getTable($arr); ?><!-- Вызов функции getTable($arr)-->
</body>
</html>
Answer 2

для квадратов работает

<?php
function renderTable(int $row, int $col, string $width, string $height, array $styles): string {
    $isSquare = $row === $col;
    $amountCell = $row * $col;
    $cellStyles = [];
    foreach ($styles as &$style) {
        $cells = array_flip(array_map('intval', explode(',' , $style['cells'])));
        unset($style['cells']);
        // выясняем ячейки для пропуска по вертикали
        $rowSpanData = [];
        $skipRow = [];
        foreach ($cells as $cellNumber => $noNeedValue) {
            $rowSpanCounter = 1;
            for ($counterRow = 1, $counterRowCell = $row + $cellNumber; $counterRow < $row; $counterRow++, $counterRowCell += $row) {
                if (isset($cells[$counterRowCell])) {
                    $rowSpanData[$cellNumber] = ++$rowSpanCounter;
                    $skipRow[$counterRowCell] = true;
                }
            }
        }
        // выясняем ячейки для пропуска по горизонтали и добаляем пропуск по вертикали
        $colSpanCellNumber = null;
        $colSpanCounter = 1;
        foreach ($cells as $cellNumber => $noNeedValue) {
            $cellStyles[$cellNumber] = $style;
            $cellStyles[$cellNumber]['needSkip'] = true;
            if (isset($cells[$cellNumber + 1])) {
                $colSpanCounter++;
                if ($colSpanCellNumber === null) {
                    $colSpanCellNumber = $cellNumber;
                }
                if (!isset($skipRow[$cellNumber + 1])) {
                    $skipRow[$cellNumber + 1] = true;
                }
            } else {
                $colSpanCounter = 1;
                $colSpanCellNumber = null;
            }
            if (!isset($skipRow[$cellNumber])) {
                if ($colSpanCounter > 1) {
                    $cellStyles[$colSpanCellNumber]['colSpan'] = $colSpanCounter;
                    $cellStyles[$colSpanCellNumber]['needSkip'] = false;
                }
                if (isset($rowSpanData[$cellNumber])) {
                    $cellStyles[$cellNumber]['rowSpan'] = $rowSpanData[$cellNumber];
                    $cellStyles[$cellNumber]['needSkip'] = false;
                }
            }
        }
    }
    unset($style);
    // рисуем таблицу
    $tr = [];
    $countCell = 1;
    for ($indexRow = 1; $indexRow <= $row; $indexRow++) {
        $td = [];
        for ($indexCol = 1; $indexCol <= $col; $indexCol++) {
            $tdStyle = '';
            $needSkip = false;
            if (isset($cellStyles[$countCell])) {
                $needSkip = $cellStyles[$countCell]['needSkip'];
                $cellStyle = $cellStyles[$countCell];
                $tdStyle = sprintf(
                    ' style="color:%s; background-color: %s;" valign="%s" align="%s"%s%s',
                    $cellStyle['color'],
                    $cellStyle['bgcolor'],
                    $cellStyle['valign'],
                    $cellStyle['align'],
                    isset($cellStyle['colSpan']) ? " colspan=\"{$cellStyle['colSpan']}\"" : '',
                    isset($cellStyle['rowSpan']) ? " rowspan=\"{$cellStyle['rowSpan']}\"" : ''
                );
            }
            if (!$needSkip) {
                $td[] = sprintf('<td%s>%s</td>', $tdStyle, $countCell);
            }
            $countCell++;
        }
        $tr[] = sprintf('<tr>%s</tr>', implode('', $td));
    }
    $table = sprintf(
        '<table width="%s" height="%s" border="1">%s</table>',
        $width,
        $height,
        implode('', $tr)
    );
    return $table;
}
$styles = [
    [
        'text'    => 'Текст красного цвета в колонках 1, 2, 4 и 5',
        'cells'   => '1,2,4,5',
        'align'   => 'center',
        'valign'  => 'center',
        'color'   => 'FF0000',
        'bgcolor' => '0099FF',
    ],
    [
        'text'    => 'Текст зеленого цвета',
        'cells'   => '8,9',
        'align'   => 'right',
        'valign'  => 'bottom',
        'color'   => '00FF00',
        'bgcolor' => 'FFFFFF',
    ],
];
echo renderTable(3, 3, 300, 300, $styles);
$styles = [
    [
        'text'    => 'Текст красного цвета в колонках 2 и 5',
        'cells'   => '2,5',
        'align'   => 'center',
        'valign'  => 'center',
        'color'   => 'FF0000',
        'bgcolor' => '0099FF',
    ],
];
echo renderTable(3, 3, 300, 300, $styles);
READ ALSO
Маппинг данных одной таблицы на разные классы по условию

Маппинг данных одной таблицы на разные классы по условию

У меня в таблице 2 сущности - группы и подгруппы, у групп и подгрупп разные свойстваНет возможности изменить структуру таблицы потому что...

116
Почему не работает Json_decode в php?

Почему не работает Json_decode в php?

Вот пример скрипта

156
MySQLi вывод записи

MySQLi вывод записи

Есть таблица с товарамиВыполняю запрос

105
Как будет работать GC

Как будет работать GC

Рассмотрим случай, когда объект хранит ссылку на самого себяНу например что-то вроде такого

92