Как сделать хороший HTML-презентационный стол из многомерного массива? - PullRequest
1 голос
/ 25 мая 2019

Мне нужно перевести результат моей базы данных в симпатичную таблицу HTML с помощью размерного массива. Я знаю, что это очень условная ситуация.

Я использую CodeIgniter и у меня уже есть некоторые данные. Я попытался извлечь результат базы данных и сделать новый формат массивов. Теперь я запутался в том, как красиво отформатировать его в HTML-таблицу.

$schedule = [];

foreach($this->data['jadwal_kelas'] AS $row)
{
  $schedule['class_name'][$row->class_name]['time'][$row->start.'-'.$row->end] = ['room' => $row->room, 'mentor_code' => $row->mentor_code];
}

А вот и результат с помощью print_r

Array
(
    [class_name] => Array
        (
            [E-1] => Array
                (
                    [time] => Array
                        (
                            [07:30:00-08:30:00] => Array
                                (
                                    [room] => A
                                    [mentor_code] => TPA-1
                                )

                            [08:30:00-09:30:00] => Array
                                (
                                    [room] => A
                                    [mentor_code] => TPA-1
                                )

                            [10:00:00-11:00:00] => Array
                                (
                                    [room] => A
                                    [mentor_code] => FIS-1
                                )

                            [11:00:00-12:00:00] => Array
                                (
                                    [room] => A
                                    [mentor_code] => FIS-1
                                )

                        )

                )

            [E-2] => Array
                (
                    [time] => Array
                        (
                            [07:30:00-08:30:00] => Array
                                (
                                    [room] => D
                                    [mentor_code] => FIS-1
                                )

                            [08:30:00-09:30:00] => Array
                                (
                                    [room] => D
                                    [mentor_code] => FIS-1
                                )

                            [10:00:00-11:00:00] => Array
                                (
                                    [room] => D
                                    [mentor_code] => BIO-1
                                )

                            [11:00:00-12:00:00] => Array
                                (
                                    [room] => D
                                    [mentor_code] => BIO-1
                                )

                        )

                )

        )

)
...

Я хочу, чтобы таблица HTML выглядела следующим образом:

Time         | E1    | E2     | E3     |
-------------|-------|--------|--------|
07:30-08:30  | TPA-1 | FIS-1  |        |
08:30-09:30  | TPA-1 | FIS-1  |        |
10:00-11:00  | FIS-1 | BIO-1  | MATH-1 |
11:00-12:00  | FIS-1 | BIO-1  | MATH-1 |
...

Я не знаю, как loop через массивы создать таблицу, как указано выше. Если бы кто-то здесь мог указать мне правильное направление, был бы очень признателен. Спасибо.

Ответы [ 2 ]

1 голос
/ 25 мая 2019

Это будет работать (проверено на примере базы данных).

// database
        $this->load->database();
        $query = 'SELECT sched.room, sched.start, sched.end, sched.mentor_code, class.class_name FROM msi_class_schedule as sched LEFT JOIN msi_class as class ON class.id_class = sched.id_class';
        $res = $this->db->query($query)->result();

        // init arrays
        $headers = [];
        $times = [];

        // build table arrays
        foreach ($res AS $row) {
            // header already exists?
            if (!in_array($row->class_name, $headers)) {
                $headers[] = $row->class_name;
            }
            $times[$row->start . '-' . $row->end][$row->class_name] = ['room' => $row->room, 'mentor_code' => $row->mentor_code];
        }

        // start building table

        echo '<table>';

        echo "<th>Time</th>";

        foreach ($headers as $header) {

            echo "<th>{$header}</th>";
        }

        foreach ($times as $time => $val) {

            echo '<tr>';

            echo "<td>{$time}</td>";

            foreach ($headers as $header) {

                if (isset($times[$time][$header])) {

                    $v = $times[$time][$header]['mentor_code'];
                } else {

                    $v = '';
                }

                echo "<td>{$v}</td>";
            }

            echo '</tr>';
        }

        echo '</table>';
    }
1 голос
/ 25 мая 2019

Это работает для меня:

<?php

$available_sections = array();
$available_times = array();
foreach ($a['class_name'] as $s => $records)
{
    $available_sections[$s] = 1;
    foreach ($records['time'] as $t => $values)
        $available_times[$t] = 1;
}
ksort($available_times);

$output = '
<table border="1" cellpadding="4" style="font-family: Arial; font-size: 12px;">
    <tr>
        <th>Time</th>';
        foreach ($available_sections as $as => $v)
            $output .= '<th>'.$as.'</th>';
$output .= '
    </tr>';

foreach ($available_times as $at => $v)
{
    $output .= '
    <tr>
        <td>'.$at.'</td>';
    foreach ($available_sections as $as => $v2)
        $output .= '<td>'.(isset($a['class_name'][$as]['time'][$at]) ? $a['class_name'][$as]['time'][$at]['mentor_code'] : '').'</td>';
    $output .= '</tr>';
}

$output .= '
</table>';

echo $output;

Результат

Result

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...