2012-06-08 2 views
1

У меня есть эта функция, которая дает мне набор параметров в выбранном вводе. Варианты дают мне время с интервалом в 5 минут. Проблема в том, что время похоже на 23:45, параметры начинаются с 00:10, а циклы - на основе переменной $ j.PHP Временной цикл между временем начала и временем окончания

Это то, что я хочу сделать словами: Дайте мне список опций за 5 минут от $ open_time до $ close_time. Если текущее время ($ timeNow) больше, чем $ open_time, установите $ open_time в значение $ timeNow, которое будет показано как первый вариант. Сделайте этот цикл только до $ close_time.

Я надеюсь, что это ясно. Цените вашу помощь :)

Вот код:

function selectTimesofDay(){ 
    $output = ""; 
    $now = date('G:i ', time()); // time now 
    $timeNow = strtotime($now); // strtotime now 
    $next_five = ceil($timeNow/300) * 300; // get next 5 minute 
    // time now rounded to next 10 minute 
    $round5minNow = date('G:i', strtotime('+15 minutes',$next_five)); 
    $open_time = strtotime('17:00'); 
    $close_time = strtotime('23:59'); 

    // in the middle of working hours, time sets to current 
    if($timeNow >= $open_time && $timeNow < $close_time){ 
     $open_time = strtotime($round5minNow); 
    } 
    $time_diff = round(($close_time - $open_time)/60) ; 
    if(date('l') == 'Friday'){ 
     $j = ($time_diff/5)+11; // working hours extended untill 1:00 AM 
    } else{ 
     $j = ($time_diff/5)-1; // working hours untill 12:00 AM 
    } 

     for($i = 0; $i <= $j; $i++){ 
      $b = $i*5; 
      $data = date('l')." - ".date("H:i", strtotime('+'.$b.' minutes', $open_time)); 
      $output .= "<option value=\"{$data}\">";  
      $output .= $data; 
      $output .= "</option>"; 
     } 

    return $output; 
} 
+0

Итак, что не так с вышеуказанным кодом? –

+0

, когда время на клиентской машине достигает 23:45, набор параметров показывает время, начинающееся с 00:15 и продолжается до 23:55! –

ответ

7

Что вам действительно нужно:

function selectTimesOfDay() { 
    $open_time = strtotime("17:00"); 
    $close_time = strtotime("23:59"); 
    $now = time(); 
    $output = ""; 
    for($i=$open_time; $i<$close_time; $i+=300) { 
     if($i < $now) continue; 
     $output .= "<option>".date("l - H:i",$i)."</option>"; 
    } 
    return $output; 
} 

Так что это делает выполняется цикл проверки каждые пять-минутный интервал между открытие и закрытие. Пропустите его, если оно есть до момента закрытия, и в противном случае добавьте параметр.

Это намного эффективнее, чем то, что вы пытались сделать, и, вероятно, легче понять.

Вы можете даже поставить это после цикла:

if($output == "") return "<option disabled>Sorry, we're closed for today</option>"; 

Кроме того, обратите внимание, как я ушел из value все время атрибута. Это связано с тем, что в отсутствие value текст опции используется как значение. Таким образом, это решение позволяет избежать ненужного дублирования.

+0

+1 для ['time()'] (http://br.php.net/manual/en/function.time.php). –

+0

Спасибо, дорогой Колинк. Это блестяще. Ценить это. –

2

Рассмотрите возможность жесткого кодирования открывать и закрывать время из корпуса функции. Цель с функциями - написать код, который вы можете использовать повторно, поэтому, если ваши часы меняются, вам не нужно изменять с помощью вашей функции, а скорее аргументы, которые передаются ему.

// sample usage: print '<select>'.selectTimesofDay('17:00', '23:59').'</select>'; 
function selectTimesofDay($start=false, $end=false, $interval='5 minutes'){ 
    $interval = DateInterval::createFromDateString($interval); 
    $rounding_interval = $interval->i * 60; 
    $date = new DateTime(
     date('Y-m-d H:i', round(strtotime($start)/$rounding_interval) * $rounding_interval) 
    ); 
    $end = new DateTime(
     date('Y-m-d H:i', round(strtotime($end)/$rounding_interval) * $rounding_interval) 
    ); 

    $opts = array(); 
    while ($date < $end) { 
     if ($date->getTimestamp() < time()) { 
      $date->add($interval); 
      continue; 
     } 
     $data = $date->format('l').' - '.$date->format('H:i'); 
     //$opts[] = '<option value="'.$date->getTimestamp().'">'.$data.'</option>'; // < -- pass the timestamp instead of a string? 
     $opts[] = '<option>'.$data.'</option>'; 
     $date->add($interval); 
    } 

    return count($opts) < 1 ? 
     '<option value="-1">- closed -</option>' : 
     implode("\n", $opts); 
} 

Документация

РНР DateTime объект - http://www.php.net/manual/en/class.datetime.php

РНР DateInterval объект - http://www.php.net/manual/en/dateinterval.format.php

PHP функции - http://www.php.net/manual/en/functions.user-defined.php

PHP функция учебника - http://www.tizag.com/phpT/phpfunctions.php

+0

Спасибо, Крис. Это отличное решение. веселит. –