减少工作时间显示的代码长度

时间:2015-09-29 03:02:14

标签: php

我已经编写了一些代码来从数据库中检索不同餐厅的各种工作时间,并显示它们是否现在不开放。

工作时间定义如下:TextProperty1

问题是我找不到编写以下所有代码的简短方法。我怎样才能缩短它的长度?

10:30to13:30/18:30to22:30

1 个答案:

答案 0 :(得分:3)

序言

我可能错了,但看看这段代码,看来你正在做的是显示餐馆现在是否开放。

在那里要优化的内容有很多:

  • 您不断重新声明$timestamp = time();以及与之关联的其他变量。这是相当低效的,因为在执行脚本期间时间不会有太大变化。即使脚本运行超过一秒钟,这实际上可以忽略不计。这必须在循环之前声明一次。
  • 您只需处理与今天相对应的那一天,即可处理一周中的所有7天,我们可以将此工作量减少85%。
  • 这么多独特的变数。这可以显着减少。阵列是我们的朋友。

让我们最小化

$currentTime = new DateTime('now');
$currentDay  = strtolower($currentTime->format('l'));

if($result > 0) {
    while($row = $stmt->fetch()) {

        $schedule = explode('/',
            str_replace('to', '/', $row[$currentDay])
        );

        foreach($schedule as $time) {
            $schedule['time'][] = DateTime::createFromFormat('G:i', $time);
        }

        $status =
            ($schedule['time'][0] <= $currentTime && $currentTime <= $schedule['time'][1])
            ||
            ($schedule['time'][2] <= $currentTime && $currentTime <= $schedule['time'][3])
            ? $lang["READY"]
            : $lang["NO-READY"];

        /*
        HTML GOES HERE
        */
    }
}
else {
    echo '0 results';
}

发生了什么

由于在执行脚本期间日期和时间不太可能发生变化,我们在开始时移动了该部分。

  • 这会为“now”返回DateTime个对象,无需拨打time()

    $currentTime = new DateTime('now');
    
  • 这将返回今天的完整文本日,将其转换为小写以匹配数据库记录(例如:tuesday):

    $currentDay  = strtolower($currentTime->format('l'));
    
  • 然后对于每个迭代的记录:

    • 我们使用$row[$currentDay],这是今天的数据。
    • 我们将to替换为/,结果为xx:xx/xx:xx/xx:xx/xx:xx
    • 我们使用/爆炸。

      $schedule = explode('/',
          str_replace('to', '/', $row[$currentDay])
      );
      
    • 我们现在有一个包含4个值的数组:

      Array
      (
          [0] => 9:30
          [1] => 13:30
          [2] => 17:30
          [3] => 20:30
      )
      
    • 我们从每个值创建一个DateTime对象,我们存储在同一个数组中:

      foreach($schedule as $time) {
          $schedule['time'][] = DateTime::createFromFormat('G:i', $time);
      }
      
    • 我们现在有了这个数组:

      Array
      (
          [0] => 9:30
          [1] => 13:30
          [2] => 17:30
          [3] => 20:30
          [time] => Array
              (
                  [0] => DateTime Object
                      (
                          [date] => 2015-09-29 09:30:00.000000
                          [timezone_type] => 3
                          [timezone] => Europe/Paris
                      )
                  [1] => DateTime Object
                      (
                          [date] => 2015-09-29 13:30:00.000000
                          [timezone_type] => 3
                          [timezone] => Europe/Paris
                      )
                  [2] => DateTime Object
                      (
                          [date] => 2015-09-29 17:30:00.000000
                          [timezone_type] => 3
                          [timezone] => Europe/Paris
                      )
                  [3] => DateTime Object
                      (
                          [date] => 2015-09-29 20:30:00.000000
                          [timezone_type] => 3
                          [timezone] => Europe/Paris
                      )
              )
      )
      
    • 我们使用三元运算符来设置状态(true ? true : false) 这将检查“现在”是否在同一时间的早晨或晚上之间。

      $status =
          ($schedule['time'][0] <= $currentTime && $currentTime <= $schedule['time'][1])
          ||
          ($schedule['time'][2] <= $currentTime && $currentTime <= $schedule['time'][3])
          ? $lang["READY"]
          : $lang["NO-READY"];
      
    • $status现已推出,可以构建html。

    • 重复直到没有记录为止。

  • 我们退出循环。

  • 我们已经完成了。