Здравствуйте уважаемые читатели блога Site on! В прошлой статье мы рассмотрели всё о циклах в PHP, но для закрепления полученных теоритических материалов, предлагаю выполнить практическую задачу, которая довольно часто встречается в повседневной жизни разработчика сайтов.
В наших с вами любимых CMS для отрисовки любой HTML таблицы используются циклы, по-другому никак. Например, у товара (смартфона) есть характеристики: ширина, высота, глубина, цвет, размер дисплея, объём памяти и тд. Все эти свойства обычно отрисовываются в виде HTML таблицы, это очень удобно и хорошо, ровно выглядит.
Чтобы понять, как это делается, сегодня мы решим такую простую задачу, как создание таблицы умножения:
Для начала нужно придумать и понять алгоритм, которому мы будем следовать. Из чего состоит HTML таблица? Давайте я нарисую:
Как видим из рисунка, тег table встречается всего 1 раз, поэтому он явно должен быть вне цикла. Повторяется у нас только строка (tr) и внутри неё ячейки, они же столбцы (td). Всё, больше у нас ничего не повторяется.
Теперь нужно решить, какой цикл лучше использовать для данной задачи. Это классический вариант и лучшим решением будет цикл for, хотя можно использовать и while, если вы к нему привыкли больше. Но нам понадобится не один цикл, а два: первый будет рисовать и считать строки (tr), а второй столбцы (td).
<?php $rows = 20; // количество строк, tr $cols = 20; // количество столбцов, td echo '<table border="1">'; for ($tr=1; $tr<=$rows; $tr++){ // в этом цикле счётчик $tr // следит за количеством строк и всегда равен текущему номеру строки. // То есть в начале $tr=1, так как в начале у нас 1 строка, затем // каждый раз прибавляем единицу, пока не дойдём до заданного количества // $rows. echo '<tr>'; for ($td=1; $td<=$cols; $td++){ // в этом цикле счётчик $td аналогичен // счётчику $tr. echo '<td>'. $tr*$td .'</td>'; } echo '</tr>'; } echo '</table>'; ?>
Готово! Результат:
В первом цикле мы отрисовываем tr, внутри него td. Этот код можно было бы назвать идеальным шаблоном отрисовки любой таблицы, но я знаю, как сделать ещё лучше. Незачем каждый раз напрягать PHP и делать вывод на экран (echo) после каждой итерации, гораздо лучше поместить всё в одно место (переменную) и сделать echo в самом конце, один единственный раз:
<?php $rows = 20; // количество строк, tr $cols = 20; // количество столбцов, td $table = '<table border="1">'; for ($tr=1; $tr<=$rows; $tr++){ $table .= '<tr>'; for ($td=1; $td<=$cols; $td++){ $table .= '<td>'. $tr*$td .'</td>'; } $table .= '</tr>'; } $table .= '</table>'; echo $table; // сделали эхо всего 1 раз ?>
Для этого мы использовали оператор .= присвоение через конкатенацию. Результат будет точно таким же. Но это ещё не всё. Нам нужно привести нашу таблицу к виду, как на самом первом рисунке в этой статье. То есть сделать первую строку и столбец полужирным и поставить зелёный фон. Такого результата можно добиться двумя способами:
Итак, делаем с помощью PHP:
<?php $rows = 20; // количество строк, tr $cols = 20; // количество столбцов, td $table = '<table border="1">'; for ($tr=1; $tr<=$rows; $tr++){ $table .= '<tr>'; for ($td=1; $td<=$cols; $td++){ if ($tr===1 or $td===1){ $table .= '<th style="color:white;background-color:green;">'. $tr*$td .'</th>'; // вычислили первую строку или столбец }else{ $table .= '<td>'. $tr*$td .'</td>'; // все ячейки, кроме ячеек из первого столбца и первой строки } } $table .= '</tr>'; } $table .= '</table>'; echo $table; // сделали эхо всего 1 раз ?>
Красота :) Можете выводить таблицу хоть 100 на 100. Балуйтесь, как хотите, это полезно для опыта. Спасибо за внимание, и приятных вам выходных!
Пожалуйста, прокомментируйте, как Вам моя статья?