Как преобразовать многомерный массив данных PHP в таблицу HTML?

Я пытаюсь отобразить форматированное HTML-расписание с использованием PHP.

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

Мое решение работает до некоторой степени, и вы можете увидеть результат на следующем изображении, но вы также можете увидеть, что по какой-то причине создается дополнительная строка. Это всегда всего одна дополнительная строка, независимо от количества сеансов в день.
Текущее решение

Данные представлены так:

Array
(
[0] => Array
(
[0] => Array
(
[id] => 1
[name] => A Monday Session
[start_time] => 10:00
)

[1] => Array
(
[id] => 5
[name] => Another Monday Session
[start_time] => 11:00
)

[2] => Array
(
[id] => 6
[name] => Yet Another Monday Session
[start_time] => 12:00
)

)

[1] => Array
(
[0] => Array
(
)

)

[2] => Array
(
[0] => Array
(
[id] => 8
[name] => A Wednesday Session
[start_time] => 14:30
)

)

[3] => Array
(
[0] => Array
(
[id] => 3
[name] => A Thursday Session
[start_time] => 09:00
)

)

[4] => Array
(
[0] => Array
(
)

)

[5] => Array
(
[0] => Array
(
)

)

[6] => Array
(
[0] => Array
(
[id] => 4
[name] => A Sunday Session
[start_time] => 13:00
)

)

)

Как видите, основные клавиши обозначают дни недели. 0 = понедельник, 1 = вторник и т. Д.
Каждый день затем есть список сессий. В этом примере в понедельник есть 3 сеанса, а в среду, четверг и воскресенье — по одному.

Обратите внимание, что у них у всех разное время запуска. В тот момент, когда сеанс вводится в данные с повторяющимся временем начала, также создаются дополнительные строки вместо общего доступа к одной и той же строке. Смотрите результат с сеансом четверга, измененным на 10:00, чтобы быть таким же, как понедельник:
Багги выход

И вот мое глючное решение. Я отметил комментарием строку, где я иду не так.

    // $sessionRows is the array of arrays containing the data above.

// Grabs array of session times from $sessionRows that has been sorted and duplicates removed.
// Current values: Array ( [0] => 09:00 [1] => 10:00 [2] => 11:00 [3] => 12:00 [4] => 13:00 [5] => 14:30 )
$sessionTimes = $this->getSessionTimes($days);

$numOfRows = count($sessionTimes);
$numOfCols = $dayIdx;

// Create grid with correct dimensions and rows represented by the session times
$grid = array();
for($i=0;$i<count($sessionTimes);$i++) {
$row = array();
for($j=0;$j<$numOfCols;$j++) {
$row[] = '<td></td>';
}
$grid[$sessionTimes[$i]] = $row;
}// Populate grid with session info added to correct coordinates.
for($i=0;$i<$numOfCols;$i++) {
echo count($sessionRows[$i]);
for($j=0;$j<count($sessionRows);$j++) {
$grid[$sessionRows[$i][$j]['start_time']][$i] = $sessionRows[$i][$j];
}
}

$rows='';
$idx = 0;
foreach($grid as $rowArray) {
$rows .= '<tr>';
/*** This lines is the problem! It adds the session time as the first column. ***/
$rows .= '<td class="time-col">'.$sessionTimes[$idx].'</td>';
for($i=0;$i<count($rowArray);$i++) {
if(!empty($rowArray[$i]['name'])){
$rows .= '<td>'.$rowArray[$i]['name'].'<br>'.$rowArray[$i]['start_time'].'</td>';
} else {
$rows .= '<td> - </td>';
}
}
$rows .= '</tr>';
$idx++;
}

return $rows;

0

Решение

Проблема заключалась в том, что массив $ sessionTimes удалял дубликаты с помощью функции array_unique ().

Эта функция сохраняла индекс удаленных значений. Таким образом, дополнительные строки создавались без значения.

Изменение этого значения на array_values ​​(array_unique ($ array)) позволило восстановить ключи и устранить проблему.

Спасибо всем, кто взглянул на это, жаль, что я не понял этого раньше!

0

Другие решения

Вот альтернативное решение, которое использует меньше циклов.

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

<?php

$sessionTimes = ['09:00', '10:00', '11:00', '12:00', '13:00', '14:30'];

$schedule = [
[
[
'id' => 1,
'name' => 'A Monday Session',
'start_time' => '10:00'

],
[
'id' => 5,
'name' => 'Another Monday Session',
'start_time' => '11:00'

],
[
'id' => 6,
'name' => 'Yet Another Monday Session',
'start_time' => '12:00'

],
],
[
[]
],
[
[
'id' => 8,
'name' => 'A Wednesday Session',
'start_time' => '14:30'
]
],
[
[
'id' => 3,
'name' => 'A Thursday Session',
'start_time' => '09:00'
]
],
[
[]
],
[
[]
],
[
[
'id' => 4,
'name' => 'A Sunday Session',
'start_time' => '13:00'
]
]
];

$output = '<table><thead><tr><th></th><th>Monday</th><th>Tuesday</th><th>Wednesday</th><th>Thursday</th><th>Friday</th><th>Saturday</th><th>Sunday</th></thead><tbody>';

foreach ($sessionTimes as $sessionTime) {
$output .= '<tr><td>'.$sessionTime.'</td>';

$day = 0;
for ($i = 0; $i < count($schedule); $i++) {
if ($i == $day) {
$sessionAtTime = '<td>-</td>';
foreach ($schedule[$day] as $session) {
if (!empty($session) && $session['start_time'] == $sessionTime) {
$sessionAtTime = '<td><b>' . $session['name'] . '</b><br>Start: ' . $sessionTime.'</td>';
}
}
$output .= $sessionAtTime;
$day++;
}
}

$output .= '</tr>';
}

$output .= '</tbody></table>';

echo $output;
0