PHP – Calcola le ore non disponibili in un calendario / agenda

Ho un problema che sembra abbastanza difficile da risolvere, quindi spero che qualcuno abbia una buona soluzione per me 🙂

Ho un programma PHP con un elenco di prenotazione per molte sale conferenze di un hotel. Devo calcolare quanto tempo durante il giorno è in uso alless 1 sala conferenze.

Ecco un esempio:

Room 1: 10h 00 to 13h 00 Room 2: 11h 00 to 14h 00 Room 3: 15h 00 to 16h 00 

Con questi numbers, ho bisogno di calcolare che l'hotel viene utilizzato durante 5 ore (10h a 14h e 15h a 16h).

Alla fine, questo mi dice quante ore l'hotel deve pagare a qualcuno per controllare le stanze nel caso qualcuno abbia un problema.

Se non hai una libreria che possa aiutarmi, un algorithm potrebbe essere un buon inizio.

Schema dell'algorithm:

  1. Ordina gli intervalli per orario di partenza.
  2. Attraversali e unisciti ai vicini che si intersecano. La condizione di intersezione sarà che il tempo di inizio del secondo intervallo è precedente o uguale al tempo di fine del primo intervallo. A causa dell'ordine, sarà necessario un solo ciclo.
  3. A questo punto hai solo intervalli disgiunti e puoi sumre i loro intervalli per get l'intervallo totale.

Ed ecco un'implementazione di tale algorithm:

 <?php // assuming hh:mm format for all the dates // $intervals = arrays( arrays( 'start' => '15:30', 'end' => '16:00', ), arrays( 'start' => '10:00', 'end' => '13:00', ), arrays( 'start' => '15:00', 'end' => '16:09', ), arrays( 'start' => '11:00', 'end' => '14:00', ), ); // 1. sort the intervals by start date // function mySortIntervals($a, $b){ return $a > $b; } usort($intervals, 'mySortIntervals'); // 2. merge adjoining intervals // $active = 0; $current = 1; $length = count($intervals); while($current < $length){ if($intervals[ $current ]['start'] <= $intervals[ $active ]['end']){ $intervals[ $active ]['end'] = max($intervals[ $active ]['end'], $intervals[ $current ]['end']); unset($intervals[ $current ]); } else{ $active = $current; } $current++; } // 3. cout the total time // $time = 0; foreach($intervals as $interval){ $time += strtotime($interval['end']) - strtotime($interval['start']); } // output // echo str_pad((int) ($time/60/60), 2, '0', STR_PAD_LEFT).':'; echo str_pad((int) (($time/60)%60), 2, '0', STR_PAD_LEFT); ?> 

Prima di tutto, è necessario definire l'intervallo o l'intervallo di tempo, ad esempio each 15 minuti. Perchè questo? perché è necessario controllare gli spazi vuoti causati dalla stanza che finisce prima del tempo, o per qualche altro motivo.

L'intervallo di tempo NON può superare i 15 minuti (il tempo è denaro).

  1. Ordina una stanza (intervallo di tempo). Deve controllare l'intervallo di tempo disponibile each volta che si verifica una richiesta.
  2. Una volta che la cella (intervallo di tempo) viene controllata, quell'intervallo di tempo non sarà più disponibile.

Per ordinare una stanza basta select l' ora (da 00 a 23) e il quarto (00; 15; 30; 45;)

Ha funzionato abbastanza bene per un business ISP. Penso che non sia diverso per un hotel. Perché l'idea dell'arco temporale è la stessa.

Ma ovviamente puoi cercare qualche lezione se non vuoi affatto scrivere il tuo codice.