Вывод таблиц в PHP: от основ до продвинутых приёмов

Раздел: Ввод/вывод в PHP -> Вывод данных

Основные подходы к созданию таблиц в PHP

Наиболее эффективный способ: вывод таблицы из двумерного массива с помощью вложенных циклов

Этот подход подходит, когда данные уже представлены в виде массива массивов (например, результат SQL-запроса). Он даёт полный контроль над структурой таблицы и стилями.

<?php
$data = [
    ['Имя', 'Возраст', 'Город'],
    ['Анна', 25, 'Москва'],
    ['Иван', 30, 'Санкт-Петербург'],
    ['Мария', 28, 'Казань']
];

echo '<table border="1">';
foreach ($data as $row) {
    echo '<tr>';
    foreach ($row as $cell) {
        echo '<td>' . htmlspecialchars($cell) . '</td>';
    }
    echo '</tr>';
}
echo '</table>';
?>
Результат: HTML-таблица с четырьмя строками и тремя столбцами.

Типичные ошибки:

  • Отсутствие htmlspecialchars() – если данные содержат HTML-теги, они будут интерпретированы браузером. Решение: всегда экранировать вывод.
  • Пропуск закрывающих тегов </td> или </tr> – таблица может отображаться некорректно. Проверять вложенность циклов.
  • Использование устаревших атрибутов (например border) – лучше задавать стили через CSS.

Как вывести таблицу с фиксированным количеством столбцов, если исходный массив одномерный?

Цель: разбить одномерный массив на строки таблицы по N элементов. Используется функция array_chunk().

<?php
$items = ['A','B','C','D','E','F'];
$columns = 3;
$rows = array_chunk($items, $columns);
echo '<table>';
foreach ($rows as $row) {
    echo '<tr>';
    foreach ($row as $cell) {
        echo '<td>' . $cell . '</td>';
    }
    // Если последняя строка неполная, можно добавить пустые ячейки
    echo '</tr>';
}
echo '</table>';
?>

Проблема: неравномерное количество элементов в последней строке. Решение: после цикла по строкам проверять длину и добавлять недостающие <td> с атрибутом colspan или пустые ячейки.

Как сгенерировать таблицу из ассоциативного массива, используя ключи как заголовки?

Цель: автоматически создать шапку таблицы на основе ключей первого элемента массива. Полезно для вывода данных из базы.

<?php
$users = [
    ['id' => 1, 'name' => 'Анна', 'email' => 'anna@example.com'],
    ['id' => 2, 'name' => 'Иван', 'email' => 'ivan@example.com']
];

echo '<table border="1">';
// Заголовок
if (!empty($users)) {
    echo '<thead><tr>';
    foreach (array_keys($users[0]) as $key) {
        echo '<th>' . htmlspecialchars($key) . '</th>';
    }
    echo '</tr></thead>';
}
// Данные
echo '<tbody>';
foreach ($users as $row) {
    echo '<tr>';
    foreach ($row as $value) {
        echo '<td>' . htmlspecialchars($value) . '</td>';
    }
    echo '</tr>';
}
echo '</tbody></table>';
?>

Ошибка: если массив пуст, попытка получить ключи приведёт к ошибке. Решение: проверять !empty($users) перед формированием заголовка.

Как использовать implode для компактного вывода строки таблицы?

Цель: сократить код, когда данные одномерные. Подходит для простых списков.

<?php
$data = ['яблоко', 'банан', 'вишня'];
echo '<table><tr><td>' . implode('</td><td>', array_map('htmlspecialchars', $data)) . '</td></tr></table>';
?>
Результат: одна строка с тремя ячейками.

Проблема: сложность чтения кода, невозможность добавить индивидуальные стили ячейкам без дополнительных проверок. Решение: применять только для очень простых случаев.

Как вывести таблицу с помощью шаблонизатора (чистый PHP как шаблон)?

Цель: отделить логику от представления. Создаётся .php-файл, в котором минимум PHP, а HTML формируется в виде шаблона.

<!-- template.php -->
<table>
    <?php foreach ($rows as $row): ?>
    <tr>
        <?php foreach ($row as $cell): ?>
        <td><?= htmlspecialchars($cell) ?></td>
        <?php endforeach; ?>
    </tr>
    <?php endforeach; ?>
</table>
Результат: такой же, как при прямом выводе, но код легче поддерживать.

Ошибка: неверное использование коротких тегов (<?=) – они должны быть включены в настройках PHP. Решение: использовать полный синтаксис <?php echo.

Расширенные примеры работы с таблицами в PHP

Пример 1: Таблица с объединением ячеек (rowspan)

Цель: вывести данные, где одна ячейка занимает несколько строк. Например, категория товаров.

Пример
<?php
$products = [
    ['category' => 'Фрукты', 'items' => ['Яблоко', 'Груша']],
    ['category' => 'Овощи', 'items' => ['Морковь', 'Картофель', 'Лук']]
];
echo '<table border="1">';
foreach ($products as $group) {
    $rowspan = count($group['items']);
    $first = true;
    foreach ($group['items'] as $item) {
        echo '<tr>';
        if ($first) {
            echo '<td rowspan="' . $rowspan . '">' . htmlspecialchars($group['category']) . '</td>';
            $first = false;
        }
        echo '<td>' . htmlspecialchars($item) . '</td>';
        echo '</tr>';
    }
}
echo '</table>';
?>
Результат: таблица, где название категории указано один раз на несколько строк.

Типичная ошибка: неправильный подсчёт rowspan, если массив пуст. Решение: проверять наличие элементов.

Пример 2: Таблица с чередованием цветов строк (zebra)

Цель: улучшить читаемость, добавляя классы для чётных и нечётных строк.

Пример
<?php
$data = [1,2,3,4,5];
echo '<table>';
foreach ($data as $index => $value) {
    $class = ($index % 2 == 0) ? 'even' : 'odd';
    echo '<tr class="' . $class . '"><td>' . $value . '</td></tr>';
}
echo '</table>';
?>
<style>
.even { background-color: #f0f0f0; }
.odd { background-color: #ffffff; }
</style>
Результат: строки с разным фоном.

Пример 3: Таблица с сортировкой (простая клиентская сортировка)

Цель: добавить возможность сортировки столбцов при нажатии на заголовок с помощью JavaScript. PHP генерирует таблицу с data-атрибутами.

Пример
<?php
$data = [
    ['Name' => 'Анна', 'Age' => 25],
    ['Name' => 'Иван', 'Age' => 30]
];
echo '<table id="sortable"><thead><tr>';
foreach (array_keys($data[0]) as $key) {
    echo '<th data-sort="' . $key . '">' . $key . '</th>';
}
echo '</tr></thead><tbody>';
foreach ($data as $row) {
    echo '<tr>';
    foreach ($row as $cell) {
        echo '<td>' . $cell . '</td>';
    }
    echo '</tr>';
}
echo '</tbody></table>';
?>
Результат: HTML-таблица с атрибутами для последующей обработки JavaScript.

Замечание: сортировка требует реализации на JavaScript – это выходит за рамки PHP, но структура подготовлена.

Пример 4: Вложенные таблицы (таблица внутри ячейки)

Цель: отобразить иерархические данные. Например, каждый пользователь может иметь список заказов.

Пример
<?php
$users = [
    ['name' => 'Анна', 'orders' => ['Заказ 1', 'Заказ 2']],
    ['name' => 'Иван', 'orders' => ['Заказ 3']]
];
echo '<table border="1">';
foreach ($users as $user) {
    echo '<tr>';
    echo '<td>' . htmlspecialchars($user['name']) . '</td>';
    echo '<td>';
    echo '<table border="1">';
    foreach ($user['orders'] as $order) {
        echo '<tr><td>' . htmlspecialchars($order) . '</td></tr>';
    }
    echo '</table>';
    echo '</td>';
    echo '</tr>';
}
echo '</table>';
?>
Результат: внешняя таблица со столбцом, содержащим внутреннюю таблицу.

Проблема: избыточная вложенность может усложнить читаемость. Решение: использовать другие способы представления, например, список внутри ячейки.

Пример 5: Таблица из CSV-файла

Цель: прочитать CSV и вывести его содержимое в виде таблицы.

Пример
<?php
$filename = 'data.csv';
if (($handle = fopen($filename, 'r')) !== FALSE) {
    echo '<table border="1">';
    while (($row = fgetcsv($handle, 0, ',')) !== FALSE) {
        echo '<tr>';
        foreach ($row as $cell) {
            echo '<td>' . htmlspecialchars($cell) . '</td>';
        }
        echo '</tr>';
    }
    fclose($handle);
    echo '</table>';
} else {
    echo 'Не удалось открыть файл.';
}
?>
Результат: таблица, соответствующая данным из CSV.

Ошибка: файл не найден или неправильная кодировка. Решение: проверять существование файла и при необходимости конвертировать кодировку функцией mb_convert_encoding().

Пример 6: Таблица с пагинацией (вывод части данных)

Цель: отобразить только часть данных, если массив большой. Реализация на PHP без JavaScript.

Пример
<?php
$allData = range(1, 100); // 100 элементов
$perPage = 10;
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$offset = ($page - 1) * $perPage;
$pageData = array_slice($allData, $offset, $perPage);

echo '<table>';
foreach ($pageData as $value) {
    echo '<tr><td>' . $value . '</td></tr>';
}
echo '</table>';

// Ссылки на страницы
$totalPages = ceil(count($allData) / $perPage);
for ($i = 1; $i <= $totalPages; $i++) {
    echo '<a href="?page=' . $i . '">' . $i . '</a> ';
}
?>
Результат: таблица из 10 строк и ссылки на другие страницы.

Проблема: небезопасная передача параметра page (SQL-инъекция неактуальна, но XSS при выводе). Решение: приводить к int, экранировать при выводе.

Работа с таблицами в PHP - comments

En
Php таблицы (php)