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