Нужно создать функцию которая генерирует 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 ячейку и покраситься в белый фон и тест должен быть зеленого цвета.
Функция сейчас берет значения из последнего массива, а не из каждого, и плюс не обедняет ячейки.
Вот такой результат должен быть при данных в массиве.
Вот.
<?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>
для квадратов работает
<?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);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
У меня в таблице 2 сущности - группы и подгруппы, у групп и подгрупп разные свойстваНет возможности изменить структуру таблицы потому что...
Рассмотрим случай, когда объект хранит ссылку на самого себяНу например что-то вроде такого