За последние 24 часа нас посетили 21214 программистов и 1089 роботов. Сейчас ищут 746 программистов ...

Привести массив в правильный вид

Тема в разделе "PHP для новичков", создана пользователем joylord, 1 ноя 2020.

  1. joylord

    joylord Активный пользователь

    С нами с:
    25 сен 2012
    Сообщения:
    17
    Симпатии:
    0
    Добрый день!

    Пытаюсь сделать график работы с проверкой текущего статуса: открыто/ закрыто.

    Нашел решение
    PHP:
    1. $storeSchedule = [
    2.     'Sun' => ['12:00 AM' => '01:00 AM', '09:00 AM' => '12:00 AM'],
    3.     'Mon' => ['09:00 AM' => '12:00 AM'],
    4.     'Tue' => ['09:00 AM' => '12:00 AM'],
    5.     'Wed' => ['09:00 AM' => '12:00 AM'],
    6.     'Thu' => ['09:00 AM' => '12:00 AM'],
    7.     'Fri' => ['09:00 AM' => '12:00 AM'],
    8.     'Sat' => ['12:00 AM' => '01:00 AM', '09:00 AM' => '12:00 AM']
    9. ];
    10.  
    11. // current OR user supplied UNIX timestamp
    12. $timestamp = time();
    13.  
    14. // default status
    15. $status = 'closed';
    16.  
    17. // get current time object
    18. $currentTime = (new DateTime())->setTimestamp($timestamp);
    19.  
    20. // loop through time ranges for current day
    21. foreach ($storeSchedule[date('D', $timestamp)] as $startTime => $endTime) {
    22.  
    23.     // create time objects from start/end times
    24.     $startTime = DateTime::createFromFormat('h:i A', $startTime);
    25.     $endTime   = DateTime::createFromFormat('h:i A', $endTime);
    26.  
    27.     // check if current time is within a range
    28.     if (($startTime < $currentTime) && ($currentTime < $endTime)) {
    29.         $status = 'open';
    30.         break;
    31.     }
    32. }
    33.  
    34. echo "We are currently: $status";
    Но мой массив имеет следующий вид.
    PHP:
    1. 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 ) )
    Помогите привести в рабочий вид.
    Заранее спасибо!
     
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    В смысле?
    Приведите пример.
     
  3. joylord

    joylord Активный пользователь

    С нами с:
    25 сен 2012
    Сообщения:
    17
    Симпатии:
    0
    PHP:
    1. $storeSchedule = [
    2.     'Sun' => ['12:00 AM' => '01:00 AM', '09:00 AM' => '12:00 AM'],
    3.     'Mon' => ['09:00 AM' => '12:00 AM'],
    4.     'Tue' => ['09:00 AM' => '12:00 AM'],
    5.     'Wed' => ['09:00 AM' => '12:00 AM'],
    6.     'Thu' => ['09:00 AM' => '12:00 AM'],
    7.     'Fri' => ['09:00 AM' => '12:00 AM'],
    8.     'Sat' => ['12:00 AM' => '01:00 AM', '09:00 AM' => '12:00 AM']
    9. ];
     
  4. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    У вас это обрабатываемый массив. Что из него должно получиться в результате?
    Ту тарабарщину, что вы привели в качестве решения, скорее всего никто рассматривать даже не будет.
    Хотите помощи - расскажите что вам нужно.
     
    joylord нравится это.
  5. joylord

    joylord Активный пользователь

    С нами с:
    25 сен 2012
    Сообщения:
    17
    Симпатии:
    0
    У меня есть массив, с подмассивами где есть день недели и диапазон времени.
    мне нужно сделать проверку, открыт ли в данный момент магазин или закрыт.

    мой массив имеет такой вид.
    PHP:
    1. 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" } }
    [​IMG]
     
  6. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    PHP:
    1. <?php
    2.  
    3. $ltime = localtime(time(), true); // assoc array
    4.  
    5. //    "tm_sec" - секунды, с 0 до 59
    6. //    "tm_min" - минуты, с 0 до 59
    7. //    "tm_hour" - часы, с 0 до 23
    8. //    "tm_mday" - день месяца, с 1 до 31
    9. //    "tm_mon" - месяц года, с 0 (январь) до 11 (декабрь)
    10. //    "tm_year" - количество лет, прошедших с 1900 г.
    11. //    "tm_wday" - день недели, с 0 (воскресенье) до 6 (суббота)
    12. //    "tm_yday" - порядковый номер дня в году, с 0 до 365
    13. //    "tm_isdst" - действует ли летнее время? Положительное значение, если учитывается, 0, если не учитывается, отрицателен, если неизвестно.
    14.  
    15. //echo '<pre>';
    16. //print_r($ltime);
    17.  
    18. $status = 'закрыто';
    19.  
    20. if(in_array($ltime["tm_hour"], range(8, 21) )) $status = 'открыто';
    21.  
    22. if(in_array($ltime["tm_wday"], array(0, 6))) $status = 'закрыто';
    23.  
    24. echo $status;
    25. ?>
     
    joylord нравится это.
  7. joylord

    joylord Активный пользователь

    С нами с:
    25 сен 2012
    Сообщения:
    17
    Симпатии:
    0
    спасибо за ответ, но как мне это применить к моему массиву, т.к. это будет много страниц магазинов, и у каждого свой график работы.
     
  8. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Тогда поясните что в вашем массиве является признаком "закрыто". Если с понедельника по пятницу еще понятно, то насчет выходных не очень.
     
  9. joylord

    joylord Активный пользователь

    С нами с:
    25 сен 2012
    Сообщения:
    17
    Симпатии:
    0
    ["work_schedule_mon"] - понедельник
    ["work_schedule_mon_start"] - начало рабочего дня понедельника
    ["work_schedule_mon_end"] - конец рабочего дня понедельника
    ...

    Mon - 08: 00 - 00: 00;
     
  10. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Нет. Так не пойдет.
    Где признак выходного дня в оригинальном массиве?
     
  11. joylord

    joylord Активный пользователь

    С нами с:
    25 сен 2012
    Сообщения:
    17
    Симпатии:
    0
    Добавил галочку true/false
    Выходной может быть любой день недели.
    Массив будет выглядеть вот так
    PHP:
    1. 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)
     
  12. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Не нужно ничего добавлять.
    Забудьте про выходной массив.
    Перефразирую вопрос.
    Где в этом массиве в элементах Sun и Sat часы работы?
    Код (Text):
    1. $storeSchedule = [
    2.     'Sun' => ['12:00 AM' => '01:00 AM', '09:00 AM' => '12:00 AM'],
    3.     'Mon' => ['09:00 AM' => '12:00 AM'],
    4.     'Tue' => ['09:00 AM' => '12:00 AM'],
    5.     'Wed' => ['09:00 AM' => '12:00 AM'],
    6.     'Thu' => ['09:00 AM' => '12:00 AM'],
    7.     'Fri' => ['09:00 AM' => '12:00 AM'],
    8.     'Sat' => ['12:00 AM' => '01:00 AM', '09:00 AM' => '12:00 AM']
    9. ];
     
  13. joylord

    joylord Активный пользователь

    С нами с:
    25 сен 2012
    Сообщения:
    17
    Симпатии:
    0
    В этом массиве в в элементах Sun и Sat - диапазон времени, т.е с 12 до часу и с 9 до 12 работает.
    Я это решение нашел тут
    Возможно, оно не совсем подходит под мой массив(
     
  14. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    PHP:
    1. <?php
    2. $storeSchedule = array(
    3.     'Sun' => array('12:00 AM' => '01:00 AM', '09:00 AM' => '12:00 AM'),
    4.     'Mon' => array('09:00 AM' => '12:00 AM'),
    5.     'Tue' => array('09:00 AM' => '12:00 AM'),
    6.     'Wed' => array('09:00 AM' => '12:00 AM'),
    7.     'Thu' => array('09:00 AM' => '12:00 AM'),
    8.     'Fri' => array('09:00 AM' => '12:00 AM'),
    9.     'Sat' => array('12:00 AM' => '01:00 AM', '09:00 AM' => '12:00 AM')
    10. );
    11.  
    12. $day = date('D');
    13. $now = time();
    14. $status = 'закрыто';
    15.  
    16. foreach ($storeSchedule as $key => $value)
    17. {
    18. if($key == $day)
    19. {
    20.    foreach($value as $k => $v)
    21.    {
    22.      $date1 = date_create($k);
    23.      $wstart = date_format($date1, 'U');
    24.      $date2 = date_create($v);
    25.      $wstop = date_format($date2, 'U');
    26.       if($now > $wstart && $now < $wstop) $status = 'открыто';
    27.    }
    28. }
    29. }
    30.  
    31. echo $status;
    32. ?>
     
    joylord нравится это.
  15. joylord

    joylord Активный пользователь

    С нами с:
    25 сен 2012
    Сообщения:
    17
    Симпатии:
    0
    Спасибо огромное за подсказку!
     
  16. twim32

    twim32 Активный пользователь

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    Небольшая поправочка:
    PHP:
    1. if($now >= $wstart && $now < $wstop) $status = 'открыто';
     
    joylord нравится это.
  17. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Да, вы правы, каждая секунда на счету.
     
  18. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.753
    Симпатии:
    1.322
    Адрес:
    Лень
    Я все никак не вкурю, '09:00 AM' => '12:00 AM'

    может 12:00 PM ?? а то с 9 часов утра до Полночи, а с полночи до часу ночи o_O
     
  19. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Вы правы.
    Но думаю,ТС уже разобрался с форматами.