2

選択入力で一連のオプションを提供するこの関数があります。オプションは、5分間隔で時間を教えてくれます。問題は、時刻が 23:45 のような場合、オプションが 00:10 から開始され、$j 変数に基づいてループすることです。

これが私がやりたいことです: $open_time から $close_time までの 5 分間隔でオプションのリストをください。現在の時刻 ($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;
}
4

2 に答える 2

11

本当に必要なものは次のとおりです。

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;
}

つまり、これが行うことは、開始と終了の間の 5 分間隔ごとにチェックするループを実行することです。現在時刻より前の場合はスキップし、それ以外の場合はオプションを追加します。

あなたがやろうとしていたことよりもはるかに効率的で、おそらく理解しやすいでしょう。

これをループの後に置くこともできます:

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

また、value属性を常に省略していたことにも注意してください。これは、 がない場合value、オプションのテキストが値として使用されるためです。したがって、このソリューションは不必要な重複を回避します。

于 2012-06-08T00:40:31.147 に答える
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);
}

ドキュメンテーション

PHP の DateTime オブジェクト - http://www.php.net/manual/en/class.datetime.php

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

于 2012-06-08T01:22:41.453 に答える