Skip to content
Advertisement

HTML table creation in php for a room booking system

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);

}
User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement