Перейти к содержанию

Таблицы

Показ простой таблицы

Для вывода больших таблиц удобно собирать отдельно набор столбцов для показа, а потом используя этот набор, выводить данные

<?php
/*
 * key - ключ, значение которого надо вывести
 * label - отображаемое название колонки
 */
$columns = [
    ['key' => 'id',    'label' => 'Ид'],
    ['key' => 'name',  'label' => 'Имя'],
    ['key' => 'email', 'label' => 'Email'],
];
$users = [
    ['id' => 1, 'name' => 'John', 'email' => 'john@example.com'],
    ['id' => 2, 'name' => 'Jack', 'email' => 'jack@example.com'],
];
?>
<table>
    <thead>
        <?php foreach ($columns as $column): ?>
            <th><?= $column['label']; ?></th>
        <?php endforeach; ?>
    </thead>

    <tbody>
        <?php foreach ($data as $row): ?>
            <tr>
                <?php foreach ($columns as $column): ?>
                    <td><?= $row[$column['key']] ?? ''; ?></td>
                <?php endforeach; ?>
            </tr>
        <?php endforeach; ?>
    </tbody>
</table>

Получение значений через dot-нотацию

Предыдущий вариант не сработает если в данных будут вложенные массивы.

$users = [
    ['id' => 1, 'name' => 'John', 'contacts' => ['email' => 'john@example.com', 'phone' => '+7 888 888 88 88']],
    ['id' => 2, 'name' => 'Jack', 'contacts' => ['email' => 'jack@example.com', 'phone' => '+7 999 999 99 99']],
];

В этом случае можно определить функцию для получения данных в dot-нотации, то есть 'contacts.email' соответствует значению ['contacts']['email']:

<?php
function getDotNotationValue(array $data, string $key)
{
    if ($key === '') {
        return null;
    }
    $keyChain = explode('.', $key);
    while ($current = array_shift($keyChain)) {
        if (!array_key_exists($current, $data)) {
            return null;
        }
        $data = $data[$current];
    }

    return $data;
}
$columns = [
    ['key' => 'name',           'label' => 'Имя'],
    ['key' => 'contacts.email', 'label' => 'Email'],
    ['key' => 'contacts.phone', 'label' => 'Телефон'],
];
?>
<table>
    <thead>
        <?php foreach ($columns as $column): ?>
            <th><?= $column['label']; ?></th>
        <?php endforeach; ?>
    </thead>

    <tbody>
        <?php foreach ($users as $user): ?>
            <tr>
                <?php foreach ($columns as $column): ?>
                    <td><?= getDotNotationValue($user, $column['key']) ?? ''; ?></td>
                <?php endforeach; ?>
            </tr>
        <?php endforeach; ?>
    </tbody>
</table>