За последние 24 часа нас посетили 30767 программистов и 1481 робот. Сейчас ищут 902 программиста ...

Обработка расписания

Тема в разделе "Прочие вопросы по PHP", создана пользователем shreck, 30 ноя 2010.

  1. shreck

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

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
    Приветствую.

    PHP:
    1.  
    2. <?php
    3.     $data = array(
    4.         array('time' => '15:30—16:30', 'title' => 'A'),
    5.         array('time' => '20:30—21:30', 'title' => 'B'),
    6.         array('time' => '01:30—02:30', 'title' => 'C'),
    7.     );
    8. ?>
    9.  
    Как видно, это какое-то расписание на день. Допустим, что это на 30.11.2010. Задача - записать эту структуру в БД (timestamp начала, timestamp окончания, название).

    Задача тривиальная, но есть проблема: как видно, "С" начинается в 01:30, что уже является 01.12.2010.

    Как можно обработать такую ситуацию?
     
  2. Ensiferum

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

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Сравнивать с предыдущим элементом. Если значение предыдущего больше, значит наступил следующий день
     
  3. shreck

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

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
    Мне нужно генерить метки timestamp :) В этом-то вся и проблема.
     
  4. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    "С" будет выполняться до "А" и "В", всё просто.

    В противном случае меняй подход - например, выставляй не только время, но и дату.
    а задания объединяй по смыслу/объекту/чему-либо, но не дате как сейчас.
     
  5. shreck

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

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
    Они объединены по дню недели.
    PHP:
    1.  
    2. <?php
    3. // $c_month, $c_day, $c_year - текущие значения даты
    4. $buf = explode('—', $time_string);
    5. $buf = array(
    6.    'from' => trim($buf[0]),
    7.    'to'   => trim($buf[1]),
    8. );
    9. foreach($buf as $diff_idx => $diff_str) {
    10.    $tmp = explode(':', $diff_str);
    11.    $ts = mktime(intval($tmp[0]), intval($tmp[1]), 0, $c_month, $c_day, $c_year);
    12. }
    13.  
    14. ?>
    15.  
     
  6. runner

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

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    можно сделать так
    1) раз блок данных у тебя на определенную дату. то введи поле "дата расписания"
    2) добавь вспомогательное поле - "следующий день" со значениям 0 и 1.
    3) формируй timestamp с учетом этого значения этого поля
     
  7. shreck

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

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
    runner, что-то я не понимаю немного.
    Мне и нужно определить момент перехода на другой день, за что как раз отвечает это вспомогательное поле.
     
  8. runner

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

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    Если я правильно тебя понял, то у тебя есть упорядоченный список элементов массива на один день недели и нужно определить, какой элемент переходит на следующий день.
    В таком разе в цикле
    час следующего элемента сравниваешь с часом предыдущего элемента
    а)если меньше - то день не изменяется
    б) если больше - то день следующий

    код примерно такой
    PHP:
    1.  
    2. $n=sizeof($data)-1;
    3. $nextDay=0;
    4. for($i=0;$i<$n;$i++)
    5. {
    6.       $start=substr($data[$i]['time'],0,2);
    7.       $end=substr($data[$i+1]['time'],0,2);
    8.       if($start>$end)
    9.       {
    10.             $nextDay=1;
    11.             // здесь начало $i-го элемента на день расписания, а конец - на следующий день
    12.       }  
    13.       else
    14.       {
    15.             if($nextDay==1)
    16.             {
    17.                   // здесь начало $i-го элемента и конец - на следующий день
    18.             }
    19.             else
    20.             {
    21.                    // здесь начало $i-го элемента и конец - на день расписания
    22.             }
    23.       }
    24.        
    25.  
    26. }
    27.  
     
  9. shreck

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

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
    runner, может быть наоборот?
    PHP:
    1.  
    2. <?php
    3.   $data = array(
    4.      array('time' => '15:30—16:30', 'title' => 'A'),
    5.      array('time' => '20:30—21:30', 'title' => 'B'),
    6.      array('time' => '01:30—02:30', 'title' => 'C'),
    7.   );
    8. ?>
    9.  
    1. $i = 0; $last = 0; $current_hour = 15;
    2. $i = 1; $last = 15; $current_hour = 20; ($current_hour < $last == false; $next = 0;)
    3. $i = 2; $last = 20; $current_hour = 01; ($current_hour < $last == true; $next = 1;)

    нет?
     
  10. runner

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

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    Да, ты прав
    Переход на следующий день, если час становится меньше часа предыдущего