Как правильнее сделать такой функционал?
есть вот такое объявления
*31 Декабря с 8:00 до 17:00
1 Января выходной день
Со 2 января по 8 Января 10:00 до 23:00
9 Января с 11:00 до 23:00*
График работы ресторана Вопрос как лучше сделать что бы в дни и часы что ресторан не работал переменная $classMain = 'not-worked'
В остальное время ресторан работает круглосуточно кроме с 6 до 8 И я делал тогда такое условия
date_default_timezone_set('Europe/Moscow');
$simpleDate = date('Y-m-d');
$nameDay = date('l', strtotime($simpleDate));
$timeMoscow = intval(date('H'));
if($nameDay == 'Saturday' || $nameDay == 'Sunday') {
if($timeMoscow == 6 && $timeMoscow == 7 || $timeMoscow == 8 || $timeMoscow == 9){
$classMain = 'not-worked';
}
}
НО делать по такой же аналогии очень долго и неправильно. Может как то поставить данные в объекты и массив и по нему проверять. у кого какие есть идеи) Буду очень рад за подсказки
Ответы (1 шт):
Я бы сделал примерно так:
<?php
function working()
{
// Время работы по определенным датам (сокращенные дни, праздники и т.п.)
$time_work=array(
array("2020-12-31 08:00:00","2020-12-31 17:00:00"),
array("2021-01-02 10:00:00","2021-01-02 23:00:00"),
array("2021-01-03 10:00:00","2021-01-02 23:00:00"),
array("2021-01-04 10:00:00","2021-01-02 23:00:00"),
array("2021-01-05 10:00:00","2021-01-02 23:00:00"),
array("2021-01-06 10:00:00","2021-01-02 23:00:00"),
array("2021-01-07 10:00:00","2021-01-02 23:00:00"),
array("2021-01-08 10:00:00","2021-01-02 23:00:00"),
array("2021-01-09 11:00:00","2021-01-02 23:00:00"),
);
// Нерабочие периоды на определенные даты (праздники, выходные и т.п.)
$time_not_work=array(
array("2021-01-01 00:00:00","2021-01-01 23:59:59"),
);
// Основной график работы, если время не попадает в одну из дат выше
$time_work_regular=array(
// Понедельник с 0 до 6 и с 8 до 0 и т.д.
'Monday' =>array(["00:00:00","05:59:59"],["08:00:00","23:59:59"]),
'Tuesday' =>array(["00:00:00","05:59:59"],["08:00:00","23:59:59"]),
'Wednesday'=>array(["00:00:00","05:59:59"],["08:00:00","23:59:59"]),
'Thursday' =>array(["00:00:00","05:59:59"],["08:00:00","23:59:59"]),
'Friday' =>array(["00:00:00","05:59:59"],["08:00:00","23:59:59"]),
'Saturday' =>array(["00:00:00","05:59:59"],["08:00:00","23:59:59"]),
'Sunday' =>array(["00:00:00","05:59:59"],["08:00:00","23:59:59"]),
);
date_default_timezone_set('Europe/Moscow');
$now_date=date("Y-m-d H:i:s");
$now_time=date("H:i:s");
$nameDay = date( "l" );
// Проверяем на работу в определенные даты
foreach ($time_work as $interval)
{
if (($now_date>=$interval[0]) and ($now_date<=$interval[1])) return true;
}
// Проверяем на нерабочие дни
foreach ($time_not_work as $interval)
{
if (($now_date>=$interval[0]) and ($now_date<=$interval[1])) return false;
}
// Проверяем на работу по графику
foreach ($time_work_regular[$nameDay] as $interval)
{
if (($now_time>=$interval[0]) and ($now_time<=$interval[1])) return true;
}
return false;
}
$now_work=working();
if ($now_work) {echo 'работает';} else {echo 'закрыт';}
Т.е. три массива: 1. Рабочие дни выбивающиеся из основного графика (сокращенные, праздник) время начала периода, время окончания периода, 2. Отдельный массив на выходные дни (периоды)., 3. Основной график, там только дни недели и время начала и окончания (если есть перерыв, то 2 записи до перерыва и после)