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

У меня есть таблица, в которой перечислены часы работы ресторанов. столбцы – id, eateries_id, day_of_week, start_time и end_time. каждый eatery представлен в таблице несколько раз, потому что для каждого дня есть отдельная запись. см. этот предыдущий вопрос для более подробной информации: определите, открыт ли ресторан сейчас (например, yelp), используя базу данных, php, js

теперь мне интересно, как взять данные из этой таблицы и распечатать ее в удобном для чтения формате. например, вместо того, чтобы говорить «M 1-3, T 1-3, W 1-3, Th 1-3, F 1-8», я хотел бы сказать «M-Th 1-3, F 1-8», , Аналогично, я хочу «М 1-3, 5-8» вместо «М 1-3, М 5-8». как я могу сделать это без метода грубой силы многочисленных операторов if?

Благодарю.

Вы хотите объединить кучу интервалов на каждый день. Придерживайтесь 24-го формата (фактически конвертируйте его в считанные секунды, я думаю), пока вам не придется преобразовывать его в дружественный человеку формат.

http://pyinterval.googlecode.com/svn/trunk/html/index.html

Беда в том, что когда вы разрешаете секундам … ресторан, который закрывается на 1 секунду раньше, будет пропущен 🙁 Возможно, вам нужно разрешить 15 или 5-минутные приращения. Разорвите данные в БД, если вам нужно. : используя временную структуру данных, объединяйте все интервалы для данного дня вместе. Теперь измените словарь. Вместо того, чтобы сопоставлять дни с интервалами, переходите к интервалам в пределах дней. Теперь найдите способ разумно представлять эти группы дней. Например, set(1,2,3) может отображаться как «MW», поэтому я бы предложил: для каждого набора мощности набора {1,2,3,4,5,6,7} (или {1,2,3,4,5} ) найти лучшее человеческое представление (вручную). Теперь жестко закодируйте эту логику – переведите ее в словарь, который отображает отсортированную строку (это важно), такую ​​как «1235», в человеческое представление, такое как «MW , F ". Отображение 1-3, 5-8 легко, как только вы работаете с объектом интервала, как описано в ссылке выше. Удачи! Позвольте мне знать, с какими проблемами вы столкнулись.

РЕДАКТИРОВАТЬ:

Это не лучший пример, который они имеют (не показывает объединение перекрывающихся интервалов), но вы заботитесь о «|» оператор

 unioned: >>> interval[1, 4] | interval[2, 5] interval([1.0, 5.0]) >>> interval[1, 2] | interval[4, 5] interval([1.0, 2.0], [4.0, 5.0]) 

Вы можете просто реализовать этот класс самостоятельно, но он может быть подвержен ошибкам.

Думал, что у меня будет удар.

Таблица испытаний

 CREATE TABLE `opening_hours` ( `id` int(11) NOT NULL AUTO_INCREMENT, `eateries_id` int(11) DEFAULT NULL, `day_of_week` int(11) DEFAULT NULL, `start_time` time DEFAULT NULL, `end_time` time DEFAULT NULL, PRIMARY KEY (`id`) ) 

Данные испытаний

 INSERT INTO `test`.`opening_hours` ( `eateries_id`, `day_of_week`, `start_time`, `end_time`) SELECT 2 AS eateries_id, 1 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all SELECT 2 AS eateries_id, 1 AS day_of_week, '17:00' AS start_time, '20:00' as end_time union all SELECT 2 AS eateries_id, 2 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all SELECT 2 AS eateries_id, 2 AS day_of_week, '17:00' AS start_time, '20:00' as end_time union all SELECT 2 AS eateries_id, 3 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all SELECT 2 AS eateries_id, 4 AS day_of_week, '13:00' AS start_time, '20:00' as end_time union all SELECT 2 AS eateries_id, 5 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all SELECT 2 AS eateries_id, 6 AS day_of_week, '13:00' AS start_time, '20:00' as end_time union all SELECT 2 AS eateries_id, 7 AS day_of_week, '13:00' AS start_time, '21:00' as end_time union all SELECT 3 AS eateries_id, 1 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all SELECT 3 AS eateries_id, 2 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all SELECT 3 AS eateries_id, 3 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all SELECT 3 AS eateries_id, 4 AS day_of_week, '13:00' AS start_time, '20:00' as end_time union all SELECT 3 AS eateries_id, 5 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all SELECT 3 AS eateries_id, 6 AS day_of_week, '13:00' AS start_time, '20:00' as end_time union all SELECT 3 AS eateries_id, 7 AS day_of_week, '13:00' AS start_time, '21:00' as end_time 

Просмотр определения для консолидации часов работы

 CREATE VIEW `test`.`groupedhours` AS select `test`.`opening_hours`.`eateries_id` AS `eateries_id`, `test`.`opening_hours`.`day_of_week` AS `day_of_week`, group_concat(concat(date_format(`test`.`opening_hours`.`start_time`,'%l'),' - ',date_format(`test`.`opening_hours`.`end_time`,'%l %p')) order by `test`.`opening_hours`.`start_time` ASC separator ', ') AS `OpeningHours` from `test`.`opening_hours` group by `test`.`opening_hours`.`eateries_id`,`test`.`opening_hours`.`day_of_week` 

Запрос на поиск «островов» смежных дней с такими же часами работы (на основе Ицика Бен Гана)

 SET @rownum = NULL; SET @rownum2 = NULL; SELECT S.eateries_id, concat(CASE WHEN S.day_of_week <> E.day_of_week THEN CONCAT(CASE S.day_of_week WHEN 1 THEN 'Su' WHEN 2 THEN 'Mo' WHEN 3 THEN 'Tu' WHEN 4 THEN 'We' WHEN 5 THEN 'Th' WHEN 6 THEN 'Fr' WHEN 7 THEN 'Sa' End, ' - ') ELSE '' END, CASE E.day_of_week WHEN 1 THEN 'Su' WHEN 2 THEN 'Mo' WHEN 3 THEN 'Tu' WHEN 4 THEN 'We' WHEN 5 THEN 'Th' WHEN 6 THEN 'Fr' WHEN 7 THEN 'Sa' End, ' ', S.OpeningHours) AS `Range` FROM ( SELECT A.day_of_week, @rownum := IFNULL(@rownum, 0) + 1 AS rownum, A.eateries_id, A.OpeningHours FROM `test`.`groupedhours` as A WHERE NOT EXISTS(SELECT * FROM `test`.`groupedhours` B WHERE A.eateries_id = B.eateries_id AND A.OpeningHours = B.OpeningHours AND B.day_of_week = A.day_of_week -1) ORDER BY eateries_id,day_of_week) AS S JOIN ( SELECT A.day_of_week, @rownum2 := IFNULL(@rownum2, 0) + 1 AS rownum, A.eateries_id, A.OpeningHours FROM `test`.`groupedhours` as A WHERE NOT EXISTS(SELECT * FROM `test`.`groupedhours` B WHERE A.eateries_id = B.eateries_id AND A.OpeningHours = B.OpeningHours AND B.day_of_week = A.day_of_week + 1) ORDER BY eateries_id,day_of_week) AS E ON S.eateries_id = E.eateries_id AND S.OpeningHours = S.OpeningHours AND S.rownum = E.rownum 

Результаты

 eateries_id Range 2 Su - Mo 1 - 3 PM, 5 - 8 PM 2 Tu 1 - 3 PM 2 We 1 - 8 PM 2 Th 1 - 3 PM 2 Fr 1 - 8 PM 2 Sa 1 - 9 PM 3 Su - Tu 1 - 3 PM 3 We 1 - 8 PM 3 Th 1 - 3 PM 3 Fr 1 - 8 PM 3 Sa 1 - 9 PM