I have to create a html table for a room booking system, but i have hit a wall trying to think of ways to insert data into cells. At the moment i am getting data from a database (start time and end time for the booking). I then loop through the times from an array and use an if statement to compare the start time to the time in the time array.
This is what i have at the moment : Room booking image
The main problem that i am having is that in my database if there are two bookings on the same day it will only show that last one in the array.
$tableStart = "<table class='table_main'><thead><tr id='table_first' class='first_last'><th class='first_last'>Time:</th>"; $tableMid = "</tr></thead><tbody>"; $tableEnd = "</tbody></table>"; foreach ($newBookings as $booking) { $tableStart .= "<th class='first_last'>$booking[0]</th>"; } foreach ($times as $time) { $tableMid .= "<tr class='even_row'><td class='time'>{$time['times']}</td>"; $i = 0; foreach ($newBookings as $booking) { unset($booking[0]); $x = count($booking); if ($x > 0) { if ($booking[$i]['start_Time'] == $time['times']) { $tableMid .= "<td class='new'>{$booking[$i]['start_Time']}</td>"; } else if($booking[$i]['end_Time'] == $time['times']) { $tableMid .= "<td class='new'>{$booking[$i]['end_Time']}</td>"; } else { $tableMid .= "<td class='new'></td>"; } } else { $tableMid .= "<td class='new'></td>"; } ++$i; } } $tableStart .= $tableMid; $tableStart .= $tableEnd; return $tableStart;`
The way i have my data set up at the moment in the arrays currently look like this:
$times = [ 0 => ['06:00'], 1 => ['06:30'], 2 => ['07:00'], 3 => ['07:30'], 4 => ['08:00'], 5 => ['08:30'], 6 => ['09:00'], 7 => ['09:30'], 8 => ['10:00'], 9 => ['10:30'], 10 => ['11:00'], 11=> ['11:30'], 12 => ['12:00'], 13 => ['12:30'], 14 => ['13:00'], 15 => ['13:30'], 16 => ['14:00'], 17 => ['14:30'], 18 => ['15:00'], 19 => ['15:30'], 20 => ['16:00'], 21 => ['16:30'], 22 => ['17:00'], 23 => ['17:30'], 24 => ['18:00'],]; $newBookings = [ 0 => [ 0 => 'Room 33' ], 1 => [ 0 => 'New room 8', 1 => [ 'room_Name' => 'New room 8', 'start_Time' => '11:30', 'end_Time' => '12:30' ] ], 2 => [ 0 => 'sds', 1 => [ 'room_Name' => 'sds', 'start_Time' => '09:30', 'end_Time' => '11:30' ], 2 => [ 'room_Name' => 'sds', 'start_Time' => '14:30', 'end_Time' => '16:30' ] ], 3 => [ 0 => 'New Room 3' ], 4 => [ 0 => 'NewRoom5' ], 5 => [ 0 => 'New room 55' ] ];
I apologise if i have left anything out or am too vague with my description. Thank you
Advertisement
Answer
For anyone who sees this i found a fix, i used ADyson’s recommendation for the array and reworked my code so that it now works correctly. For anyone interested here is the code i used :
public function render(): string { $data = $this->tableData; //from abstract class contains table data $times = $this->tableTimes; //gets times $rooms = $this->roomNames; //gets room names $startTime = $times[0]['start_time']; //sets the start time $endTime = $times[0]['end_time']; // sets the end time $times = $this->setTimeArray($startTime, $endTime); //goes to function $newBookings = $this->setDataArray($data, $rooms); // goes to function $tableStart = "<table class='table_main'><thead><tr id='table_first' class='first_last'><th class='first_last'>Room:</th>"; $tableMid = "</tr></thead><tbody>"; $tableEnd = "</tbody></table>"; foreach ($times as $key => $time) { $tableStart .= "<th class='first_last'>{$time}</th>"; } foreach ($newBookings as $booking) { $tableMid .= "<tr class='even_row'><td class='room_Name'>{$booking['Room']}</td>"; $x = 0; $e = 0; foreach ($times as $time) { if ($x == count($booking['Bookings'])) { $x = 0; } if ($e == count($booking['Bookings'])) { $e = 0; } if (count($booking['Bookings']) < 1) { $tableMid .= "<td class='new'></td>"; } else if ($booking['Bookings'][$x]['start_Time'] == $time) { $tableMid .= "<td class='room_Booked'>{$booking['Bookings'][$x]['start_Time']}</td>"; $x++; } else if ($booking['Bookings'][$e]['end_Time'] == $time) { $tableMid .= "<td class='room_Booked'>{$booking['Bookings'][$e]['end_Time']}</td>"; $e++; } else { $tableMid .= "<td class='new'></td>"; } } } $tableStart .= $tableMid; $tableStart .= $tableEnd; return $tableStart; }
Setting the times to an array
public function setTimeArray($startTime, $endTime) { $i = 0; $endTimes = strtotime($endTime); $endTime = date("H:i", strtotime('+30 minutes', $endTimes)); do { $times[$i] = $startTime; $time = strtotime($startTime); $startTime = date("H:i", strtotime('+30 minutes', $time)); $i++; } while ($startTime != $endTime); return ($times); }
Putting room booking data into one array
public function setDataArray($data, $rooms) { $newBookings = []; $x = 0; foreach ($rooms as $key) { $newBookings[$x] = array( 'Room' => $key['room_name'], 'Bookings' => [] ); $y = 0; foreach ($data as $value) { if ($value['room_name'] == $newBookings[$x]['Room']) { $newBookings[$x]['Bookings'][$y] = [ 'room_Name' => $value['room_name'], 'start_Time' => $value['requested_time'], 'end_Time' => $value['requested_time_end'] ]; $y++; } } $x++; } return ($newBookings); }