Преобразование массива в таблицу с горизонтально расположенными столбцами располагает фиксированное количество элементов в строке.
Первое множество заполняет начальную строку таблицы, второе множество располагается в следующей строке и так далее. Наконец доходим до последней строки, которую, возможно, придется заполнить пустыми ячейками таблицы.
Функция pc_grid_horizontal(), показанная в примере 4.8, позволяет указать массив и число столбцов. Она предполагает ширину таблицы, равную 100%, но ее можно изменить с помощью переменной $table_width.
Пример 4.8. 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;