Конвертация PHP массива в таблицу с примерами кода

Раздел: Работа с данными -> Работа с массивами и выводом данных в PHP

Преобразование массива в таблицу на PHP

Наиболее эффективное и простое решение для преобразования массива в HTML-таблицу основано на цикле foreach. Этот подход работает с любыми видами массивов, легко читается и позволяет контролировать каждую ячейку. Пример ниже выводит двумерный массив (список строк) с автоматическим определением заголовков.


<?php
$data = [
  ['name' => 'Иван', 'age' => 25, 'city' => 'Москва'],
  ['name' => 'Мария', 'age' => 30, 'city' => 'Санкт-Петербург'],
  ['name' => 'Алексей', 'age' => 28, 'city' => 'Казань']
];

if (!empty($data)) {
  echo '<table border="1">';
  // Заголовки из ключей первого элемента
  echo '<thead><tr>';
  foreach (array_keys($data[0]) as $key) {
    echo '<th>' . htmlspecialchars($key) . '</th>';
  }
  echo '</tr></thead>';
  // Строки
  echo '<tbody>';
  foreach ($data as $row) {
    echo '<tr>';
    foreach ($row as $value) {
      echo '<td>' . htmlspecialchars((string)$value) . '</td>';
    }
    echo '</tr>';
  }
  echo '</tbody></table>';
}
?>
  

Php массивы таблица (преобразование массива в таблицу php)

Данный код выводит аккуратную таблицу с границами. Использование htmlspecialchars защищает от XSS-атак, если данные содержат HTML-символы. Проблема может возникнуть, если массив пуст: тогда код завершится ошибкой из-за array_keys($data[0]). Решение - проверка !empty($data).

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

  • Забыть экранировать вывод - приводит к уязвимостям или поломке таблицы при наличии символов <, >, &.
  • Предполагать, что все строки имеют одинаковую структуру - если ключи различаются, таблица получится неровной. Рекомендуется предварительно унифицировать ключи.
  • Не учитывать преобразование в строку - для объектов или null может вывести пустое место или ошибку. Используйте приведение (string) или проверку is_null.

Как отобразить ассоциативный массив, сделав ключи заголовками столбцов?

Решение выше уже показывает этот вариант. Для случая, когда ключи заранее неизвестны, подходит array_keys(). Если же нужно задать заголовки вручную, можно использовать отдельный массив заголовков:


$headers = ['Имя', 'Возраст', 'Город'];
echo '<tr>';
foreach ($headers as $h) {
  echo '<th>' . htmlspecialchars($h) . '</th>';
}
echo '</tr>';
  

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

Как преобразовать массив объектов (например, из ORM) в таблицу?

Для объектов используйте get_object_vars() или (array):


class User {
  public $name;
  public $age;
  public function __construct($n, $a) { $this->name = $n; $this->age = $a; }
}
$users = [new User('Пётр', 33), new User('Анна', 27)];
foreach ($users as $user) {
  $row = (array) $user;
  // далее foreach по $row
}
  

Важно: приватные и защищённые свойства не попадут в массив. Рекомендуется использовать геттеры или Reflection. Также объекты могут быть из внешних библиотек, где свойства непубличные.

Как вывести многомерный массив с вложенностью (например, категории)?

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


$categories = [
  ['name' => 'Электроника', 'items' => ['Телефоны', 'Ноутбуки']],
  ['name' => 'Одежда', 'items' => ['Футболки', 'Джинсы']]
];
echo '<table>';
foreach ($categories as $cat) {
  echo '<tr><td rowspan="' . count($cat['items']) . '">' . $cat['name'] . '</td>';
  $first = true;
  foreach ($cat['items'] as $item) {
    if (!$first) echo '<tr>';
    echo '<td>' . $item . '</td></tr>';
    $first = false;
  }
}
echo '</table>';
  

Сложность реализации и риск несинхронизированных rowspan. Удобнее использовать отдельный массив с плоской структурой и CSS-стилизацией.

Как упростить код с помощью array_map и implode?

Функциональный подход подходит для быстрой генерации строк без заголовков:


$data = [['a', 'b'], ['c', 'd']];
$table = '<table>';
$table .= '<tr><th>A</th><th>B</th></tr>';
$table .= implode('', array_map(function($row) {
  return '<tr><td>' . implode('</td><td>', array_map('htmlspecialchars', $row)) . '</td></tr>';
}, $data));
$table .= '</table>';
echo $table;
  

Проблема: сложно обрабатывать ассоциативные массивы с разными ключами. Заголовки приходится задавать вручную. Для простых списков - удобно.

Как добавить стили Bootstrap к таблице?

Достаточно включить классы в теги:


echo '<table class="table table-striped table-bordered">';
  

Проблема: если библиотека не подключена, стили не работают. Всегда проверяйте наличие CSS-фреймворка на странице.

Что делать, если массив очень большой (тысячи строк)?

Используйте array_chunk и пагинацию (или AJAX-подгрузку). Пример разбивки на страницы по 50 записей:


$chunks = array_chunk($data, 50);
$page = $_GET['page'] ?? 1;
$rows = $chunks[$page - 1] ?? [];
// вывести только $rows
  

Проблема: пагинация требует отслеживания общего количества страниц и ссылок. Для полноты нужно реализовать навигацию.

Заключение:

Выбор метода зависит от структуры данных, требований к производительности и стилизации. Для большинства задач достаточно базового цикла с экранированием. Многомерные и объектные массивы требуют дополнительной обработки. При работе с большими объёмами данных стоит предусмотреть постраничный вывод.

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

Пример 1: Таблица с экранированием HTML-символов

Пример

<?php
$data = [
  ['text' => '<b>жирный</b>', 'note' => 'x > y'],
  ['text' => '&амперсанд', 'note' => '100 < 200']
];
echo '<table border="1">';
foreach ($data as $row) {
  echo '<tr>';
  foreach ($row as $value) {
    echo '<td>' . htmlspecialchars($value, ENT_QUOTES, 'UTF-8') . '</td>';
  }
  echo '</tr>';
}
echo '</table>';
?>
Результат: все HTML-теги отобразятся как текст, а не исполнятся. Браузер покажет <b>жирный</b> и x > y.

Пример 2: Таблица с объединением строк (rowspan) для группировки

Пример

<?php
$groups = [
  ['group' => 'Фрукты', 'items' => ['Яблоко', 'Банан']],
  ['group' => 'Овощи', 'items' => ['Морковь', 'Огурец']]
];
echo '<table border="1">';
foreach ($groups as $g) {
  $count = count($g['items']);
  $first = true;
  foreach ($g['items'] as $item) {
    echo '<tr>';
    if ($first) {
      echo '<td rowspan="' . $count . '">' . htmlspecialchars($g['group']) . '</td>';
      $first = false;
    }
    echo '<td>' . htmlspecialchars($item) . '</td>';
    echo '</tr>';
  }
}
echo '</table>';
?>
Результат: первая колонка объединяет строки по количеству элементов в группе.

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

Пример

<?php
$data = [['a', 'b'], ['c', 'd'], ['e', 'f']];
echo '<table class="striped">';
$i = 0;
foreach ($data as $row) {
  $class = ($i++ % 2 === 0) ? 'even' : 'odd';
  echo '<tr class="' . $class . '">';
  foreach ($row as $cell) {
    echo '<td>' . htmlspecialchars($cell) . '</td>';
  }
  echo '</tr>';
}
echo '</table>';
?>
Результат: строки попеременно получают классы even и odd. С CSS .even { background: #f0f0f0; } .odd { background: #fff; } будет видно чередование.

Пример 4: Таблица со ссылками в ячейках

Пример

<?php
$data = [
  ['title' => 'Google', 'url' => 'https://google.com'],
  ['title' => 'PHP', 'url' => 'https://php.net']
];
echo '<table border="1">';
foreach ($data as $row) {
  echo '<tr>';
  echo '<td><a href="' . htmlspecialchars($row['url']) . '">' . htmlspecialchars($row['title']) . '</a></td>';
  echo '</tr>';
}
echo '</table>';
?>
Результат: каждая ячейка содержит гиперссылку.

Пример 5: Генерация таблицы через буферизацию вывода (ob_start)

Пример

<?php
$data = [['name' => 'Anna'], ['name' => 'Bob']];
ob_start();
?>
<table>
  <tr><th>Name</th></tr>
  <?php foreach ($data as $row): ?>
  <tr><td><?= htmlspecialchars($row['name']) ?></td></tr>
  <?php endforeach; ?>
</table>
<?php
$html = ob_get_clean();
echo $html;
?>
Результат: весь HTML собран в переменную $html, что удобно для дальнейшей обработки (например, отправки в письме).

Пример 6: Обработка null и пустых значений

Пример

<?php
$data = [
  ['product' => 'Книга', 'price' => 250],
  ['product' => 'Ручка', 'price' => null]
];
foreach ($data as $row) {
  echo '<tr>';
  foreach ($row as $key => $value) {
    $val = is_null($value) ? '-' : htmlspecialchars((string)$value);
    echo '<td>' . $val . '</td>';
  }
  echo '</tr>';
}
?>
Результат: вместо пустой ячейки отобразится длинное тире (-), но в коде используется дефис, чтобы не нарушать правило о длинном тире.

Пример 7: Таблица из CSV-файла, преобразованного в массив

Пример

<?php
$csv = "Имя,Возраст\nИван,25\nМария,30";
$lines = explode("\n", $csv);
$data = array_map('str_getcsv', $lines);
// первый элемент - заголовки
$headers = array_shift($data);
echo '<table>';
echo '<tr>';
foreach ($headers as $h) echo '<th>' . htmlspecialchars($h) . '</th>';
echo '</tr>';
foreach ($data as $row) {
  echo '<tr>';
  foreach ($row as $cell) echo '<td>' . htmlspecialchars($cell) . '</td>';
  echo '</tr>';
}
echo '</table>';
?>
Результат: корректно обработанная таблица из CSV строки.

Преобразование массива в таблицу PHP - comments

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