PHP: двумерная таблица с любым содержимым
Функция tab ($rows, $cols, $callback)
просто строит таблицу размерностью $rows
строк на $cols
столбцов, заполняя её формулой, взятой из вызова callback-функции. Подобные решения на интерпретируемых языках следует применять всегда, если мы хотим использовать гибкие аналоги указателей на функции или функций-делегатов в языках компилируемых. Кроме того, функция не выводит, а просто возвращает строку с содержимым - ведь её использование не обязательно предполагает вывод содержимого в браузер.
Чтобы табулирование было таким же "универсальным", как на Mathcad, передадим третьим аргументом в функцию tab
безымянную callback-функцию от аргументов $i
, $j
, определяющую, какое значение печатать в ячейке с соответствующими координатами.
В нашем случае печатается просто сумма номеров строки и столбца, отсчитываемых с нуля, а заполнить ячейки таблицы 3 x 3 обычными пробелами мы могли бы так:
echo tab (3, 3, function ($i, $j) { return ' '; } );
Стиль документа - примерно как здесь, таблица без табличных тегов, но на разделах. Ниже показан полный документ .php
в кодировке Юникода utf-8.
<!doctype html> <html lang="ru"> <head> <meta charset="utf-8"> <title>Таблица</title> <style> .mytab, .myrow, .mycell { border: 1px solid black; border-collapse: collapse; padding: 4px; } .mytab { margin: auto; display: table; } .myrow { display: table-row; } .mycell { display: table-cell; text-align: center; min-width: 40px; } </style> </head> <body> <?php function tab ($rows, $cols, $callback) { $content = '<div class="mytab">'; //таблица - класс mytab for ($i=0; $i<$rows; $i++) { $content .= '<div class="myrow">'; //строка - класс myrow for ($j=0; $j<$cols; $j++) //ячейка - класс mycell $content .= '<div class="mycell">'.$callback($i,$j).'</div>'; $content .= '</div>'; } return $content.'</div>'; //вернем результат как строку с разметкой } echo tab (5, 5, function ($i,$j) { return $i+$j; } ); //3-й аргумент - callback-функция с формулой для заполнения ячеек ?> </body> </html>

Вид этой странички в браузере
02.10.2019, 12:11 [1236 просмотров]