Добрый день! Пытаюсь сделать график работы с проверкой текущего статуса: открыто/ закрыто. Нашел решение PHP: $storeSchedule = [ 'Sun' => ['12:00 AM' => '01:00 AM', '09:00 AM' => '12:00 AM'], 'Mon' => ['09:00 AM' => '12:00 AM'], 'Tue' => ['09:00 AM' => '12:00 AM'], 'Wed' => ['09:00 AM' => '12:00 AM'], 'Thu' => ['09:00 AM' => '12:00 AM'], 'Fri' => ['09:00 AM' => '12:00 AM'], 'Sat' => ['12:00 AM' => '01:00 AM', '09:00 AM' => '12:00 AM'] ]; // current OR user supplied UNIX timestamp $timestamp = time(); // default status $status = 'closed'; // get current time object $currentTime = (new DateTime())->setTimestamp($timestamp); // loop through time ranges for current day foreach ($storeSchedule[date('D', $timestamp)] as $startTime => $endTime) { // create time objects from start/end times $startTime = DateTime::createFromFormat('h:i A', $startTime); $endTime = DateTime::createFromFormat('h:i A', $endTime); // check if current time is within a range if (($startTime < $currentTime) && ($currentTime < $endTime)) { $status = 'open'; break; } } echo "We are currently: $status"; Но мой массив имеет следующий вид. PHP: Array ( [work_schedule_mon] => Array ( [work_schedule_mon_start] => 08:00 [work_schedule_mon_end] => 00:00 ) [work_schedule_tue] => Array ( [work_schedule_tue_start] => 09:00 [work_schedule_tue_end] => 00:00 ) [work_schedule_wed] => Array ( [work_schedule_wed_start] => 00:00 [work_schedule_wed_end] => 00:00 ) [work_schedule_tru] => Array ( [work_schedule_tru_start] => 00:00 [work_schedule_tru_end] => 00:00 ) [work_schedule_fri] => Array ( [work_schedule_fri_start] => 00:00 [work_schedule_fri_end] => 00:00 ) [work_schedule_sat] => Array ( [work_schedule_sat_start] => 00:00 [work_schedule_sat_end] => 00:00 ) [work_schedule_sun] => Array ( [work_schedule_sun_start] => 00:00 [work_schedule_sun_end] => 00:00 ) ) Помогите привести в рабочий вид. Заранее спасибо!
PHP: $storeSchedule = [ 'Sun' => ['12:00 AM' => '01:00 AM', '09:00 AM' => '12:00 AM'], 'Mon' => ['09:00 AM' => '12:00 AM'], 'Tue' => ['09:00 AM' => '12:00 AM'], 'Wed' => ['09:00 AM' => '12:00 AM'], 'Thu' => ['09:00 AM' => '12:00 AM'], 'Fri' => ['09:00 AM' => '12:00 AM'], 'Sat' => ['12:00 AM' => '01:00 AM', '09:00 AM' => '12:00 AM'] ];
У вас это обрабатываемый массив. Что из него должно получиться в результате? Ту тарабарщину, что вы привели в качестве решения, скорее всего никто рассматривать даже не будет. Хотите помощи - расскажите что вам нужно.
У меня есть массив, с подмассивами где есть день недели и диапазон времени. мне нужно сделать проверку, открыт ли в данный момент магазин или закрыт. мой массив имеет такой вид. PHP: array(7) { ["work_schedule_mon"]=> array(2) { ["work_schedule_mon_start"]=> string(5) "08:00" ["work_schedule_mon_end"]=> string(5) "00:00" } ["work_schedule_tue"]=> array(2) { ["work_schedule_tue_start"]=> string(5) "09:00" ["work_schedule_tue_end"]=> string(5) "00:00" } ["work_schedule_wed"]=> array(2) { ["work_schedule_wed_start"]=> string(5) "00:00" ["work_schedule_wed_end"]=> string(5) "00:00" } ["work_schedule_tru"]=> array(2) { ["work_schedule_tru_start"]=> string(5) "00:00" ["work_schedule_tru_end"]=> string(5) "00:00" } ["work_schedule_fri"]=> array(2) { ["work_schedule_fri_start"]=> string(5) "00:00" ["work_schedule_fri_end"]=> string(5) "00:00" } ["work_schedule_sat"]=> array(2) { ["work_schedule_sat_start"]=> string(5) "00:00" ["work_schedule_sat_end"]=> string(5) "00:00" } ["work_schedule_sun"]=> array(2) { ["work_schedule_sun_start"]=> string(5) "00:00" ["work_schedule_sun_end"]=> string(5) "00:00" } }
PHP: <?php $ltime = localtime(time(), true); // assoc array // "tm_sec" - секунды, с 0 до 59 // "tm_min" - минуты, с 0 до 59 // "tm_hour" - часы, с 0 до 23 // "tm_mday" - день месяца, с 1 до 31 // "tm_mon" - месяц года, с 0 (январь) до 11 (декабрь) // "tm_year" - количество лет, прошедших с 1900 г. // "tm_wday" - день недели, с 0 (воскресенье) до 6 (суббота) // "tm_yday" - порядковый номер дня в году, с 0 до 365 // "tm_isdst" - действует ли летнее время? Положительное значение, если учитывается, 0, если не учитывается, отрицателен, если неизвестно. //echo '<pre>'; //print_r($ltime); $status = 'закрыто'; if(in_array($ltime["tm_hour"], range(8, 21) )) $status = 'открыто'; if(in_array($ltime["tm_wday"], array(0, 6))) $status = 'закрыто'; echo $status; ?>
спасибо за ответ, но как мне это применить к моему массиву, т.к. это будет много страниц магазинов, и у каждого свой график работы.
Тогда поясните что в вашем массиве является признаком "закрыто". Если с понедельника по пятницу еще понятно, то насчет выходных не очень.
["work_schedule_mon"] - понедельник ["work_schedule_mon_start"] - начало рабочего дня понедельника ["work_schedule_mon_end"] - конец рабочего дня понедельника ... Mon - 08: 00 - 00: 00;
Добавил галочку true/false Выходной может быть любой день недели. Массив будет выглядеть вот так PHP: array(7) { ["work_schedule_mon"]=> array(3) { ["work_schedule_mon_start"]=> string(5) "08:00" ["work_schedule_mon_end"]=> string(5) "00:00" ["work_schedule_mon_hol"]=> bool(false) } ["work_schedule_tue"]=> array(3) { ["work_schedule_tue_start"]=> string(5) "09:00" ["work_schedule_tue_end"]=> string(5) "00:00" ["work_schedule_tue_hol"]=> bool(false) } ["work_schedule_wed"]=> array(3) { ["work_schedule_wed_start"]=> string(5) "00:00" ["work_schedule_wed_end"]=> string(5) "00:00" ["work_schedule_wed_hol"]=> bool(false) } ["work_schedule_tru"]=> array(3) { ["work_schedule_tru_start"]=> string(5) "00:00" ["work_schedule_tru_end"]=> string(5) "00:00" ["work_schedule_tru_hol"]=> bool(false) } ["work_schedule_fri"]=> array(3) { ["work_schedule_fri_start"]=> string(5) "00:00" ["work_schedule_fri_end"]=> string(5) "00:00" ["work_schedule_fri_hol"]=> bool(false) } ["work_schedule_sat"]=> array(3) { ["work_schedule_sat_start"]=> string(5) "00:00" ["work_schedule_sat_end"]=> string(5) "00:00" ["work_schedule_sat_hol"]=> bool(true) } ["work_schedule_sun"]=> array(3) { ["work_schedule_sun_start"]=> string(5) "00:00" ["work_schedule_sun_end"]=> string(5) "00:00" ["work_schedule_sun_hol"]=> bool(true) } } Если выходной - ["work_schedule_sun_hol"]=> bool(true) Не выходной - ["work_schedule_mon_hol"]=> bool(false)
Не нужно ничего добавлять. Забудьте про выходной массив. Перефразирую вопрос. Где в этом массиве в элементах Sun и Sat часы работы? Код (Text): $storeSchedule = [ 'Sun' => ['12:00 AM' => '01:00 AM', '09:00 AM' => '12:00 AM'], 'Mon' => ['09:00 AM' => '12:00 AM'], 'Tue' => ['09:00 AM' => '12:00 AM'], 'Wed' => ['09:00 AM' => '12:00 AM'], 'Thu' => ['09:00 AM' => '12:00 AM'], 'Fri' => ['09:00 AM' => '12:00 AM'], 'Sat' => ['12:00 AM' => '01:00 AM', '09:00 AM' => '12:00 AM'] ];
В этом массиве в в элементах Sun и Sat - диапазон времени, т.е с 12 до часу и с 9 до 12 работает. Я это решение нашел тут Возможно, оно не совсем подходит под мой массив(
PHP: <?php $storeSchedule = array( 'Sun' => array('12:00 AM' => '01:00 AM', '09:00 AM' => '12:00 AM'), 'Mon' => array('09:00 AM' => '12:00 AM'), 'Tue' => array('09:00 AM' => '12:00 AM'), 'Wed' => array('09:00 AM' => '12:00 AM'), 'Thu' => array('09:00 AM' => '12:00 AM'), 'Fri' => array('09:00 AM' => '12:00 AM'), 'Sat' => array('12:00 AM' => '01:00 AM', '09:00 AM' => '12:00 AM') ); $day = date('D'); $now = time(); $status = 'закрыто'; foreach ($storeSchedule as $key => $value) { if($key == $day) { foreach($value as $k => $v) { $date1 = date_create($k); $wstart = date_format($date1, 'U'); $date2 = date_create($v); $wstop = date_format($date2, 'U'); if($now > $wstart && $now < $wstop) $status = 'открыто'; } } } echo $status; ?>
Я все никак не вкурю, '09:00 AM' => '12:00 AM' может 12:00 PM ?? а то с 9 часов утра до Полночи, а с полночи до часу ночи