Разработчику. Сборник рецептов PHP
Задавайте вопросы

Программа: Печать массива в виде
HTML-таблицы

Вернуться назад

Преобразование массива в таблицу с горизонтально расположенными столбцами располагает фиксированное количество элементов в строке.

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

Функция pc_grid_horizontal(), показанная в примере описанном ниже, позволяет указать массив и число столбцов. Она предполагает ширину таблицы, равную 100%, но ее можно изменить с помощью переменной $table_width.

Пример pc_grid_horizontal()

function pc_grid_horizontal($array , $size) {
     // вычисляем ширину элемента <td> в процентах
     $table_width = 100;
     $width = intval($table_width / $size);

     // определяем вид тегов <tr> и <td>
     // функция sprintf( ) требует использования %% для получения символа %
     $tr = '<tr align="center">';
     $td = "<td width=\"$width%%\">%s</td>";

     // открываем таблицу
     $grid = "<table width=\"$table_width%\">$tr";

     // выполняем цикл по элементам и отображаем в строке длиной $sized
     // $i отслеживает, когда нужно начинать новую строку таблицы
     $i = 0;
     foreach ($array as $e) {
          $grid .= sprintf($td , $e);
          $i++;

          // конец строки
          // закрываем ее и начинаем новую
          if (!($i % $size)) {
               $grid .= "</tr>$tr";
          }
     }

     // заполняем остальные ячейки пробелами
     while ($i % $size) {
          $grid .= sprintf($td , '   ');
          $i++;
     }

     // добавляем </tr> при необходимости
     $end_tr_len = strlen($tr) * - 1;
     if (substr($grid , $end_tr_len) != $tr) {
          $grid .= '</tr>';
          } else {
                    $grid = substr($grid , 0 , $end_tr_len);
               }
     // закрываем таблицу
     $grid .= '</table>';

     return $grid;
}

Функция начинается с вычисления ширины каждого элемента <td> в процентах к общей ширине таблицы. В зависимости от количества столбцов и общего размера, сумма ширины элементов <td> может не совпадать с шириной элемента <table>, но это не должно заметно влиять на отображение HTML. Затем определяются теги <td> и <tr>, при этом используется нотация форматирования в стиле функции printf. Для получения символа %, необходимого для выражения в процентах ширины элемента <td>, используйте сдвоенный символ %%.

Ядро функции – это цикл foreach по элементам массива, в котором каждый тег <td> добавляется к переменной $grid. При достижении конца строки, что происходит, когда общее число обработанных элементов становится кратным количеству элементов в строке, элемент <tr> закрывается и открывается снова.

После того как добавлены все элементы, необходимо заполнить последнюю строку пробелами или пустыми элементами <td>. Для корректной передачи таблицы в броузер поместите непрерывную пробельную строку в ячейку данных, вместо того чтобы оставлять ее пустой. Теперь убедитесь в отсутствии лишних элементов <tr> в конце сетки, что может произойти, когда количество элементов становится кратным ширине (другими словами, если не нужно добавлять заполняющие ячейки). Наконец, можно закрыть таблицу.

Например, напечатаем названия 50 штатов США в таблице из шести столбцов:

// устанавливаем соединение с базой данных
$dsn = 'mysql://user:password@localhost/table';
$dbh = DB::connect($dsn);
if (DB::isError($dbh)) { die ($dbh -> getMessage()); }

// запрашиваем в базе данных информацию о 50-ти штатах
$sql = "SELECT state FROM states";
$sth = $dbh -> query($sql);

// загружаем данные из базы данных в массив
while ($row = $sth -> fetchRow(DB_FETCHMODE_ASSOC)) {
$states[ ] = $row['state'];

}
// генерируем HTML таблицу
$grid = pc_grid_horizontal($states , 6);

// и печатаем ее
print $grid;

Поскольку 50 не делится без остатка на шесть, то в последней строке есть четыре дополнительных заполняющих ячейки.

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования

Рейтинг Сайтов ДОСКИ.РУ