【问题标题】:PHP select closest to variablePHP选择最接近变量
【发布时间】:2012-10-26 23:39:33
【问题描述】:

只是想知道如何选择最接近的变量。 我有一套军事时间清单,即: 0030 0100 0130 0200 等等……

全部以半小时为增量。我将如何选择最接近现在的时间。 例如。 用户单击按钮,php 获取现在的时间,并选择最接近的时间变量。所以如果是 0144,它会选择 0130。如果是 0146,它会选择 0200。

【问题讨论】:

标签: php


【解决方案1】:

由于您总是以 30 分钟的间隔存储时间,因此从 30 中减去当前时间的最后 2 位数字(分钟)。

例如: 如果当前时间是0146,

  1. 去掉 46(分钟)
  2. 取 30 的绝对差
  3. 如果差值 > 15,则选择 0146 的下一个可用时隙 (这里是 0200)
  4. 如果差

希望这会有所帮助。

【讨论】:

  • 是否需要一些代码来支持这一点,因为它不是真正的答案,而是更多的“如何舍入数字”指南?
【解决方案2】:

为方便起见,在您的计算中将它们视为整数,忽略前导零,因为它们对您的计算没有用处。

您有 144 并且您想向下舍入到 130 或 146,直到 200。类似地,14 (0014) 会变成 0 (0000),而 15 (0015) 会变成 30。

简单的 if/thens 就足以完成这个。

【讨论】:

    【解决方案3】:

    我认为应该这样做:

    function military_time() {
        $hour = (int) date('G');
        $minute = (int) date('i');
    
        $rounded_minute = round($minute / 30);
    
        switch ($rounded_minute) {
            case 0:
                $minute = '00';
                break;
            case 1:
                $minute = '30';
                break;
            case 2:
                $minute = '00';
                $hour = (int) $hour + 1;
                break;
        }
    
        // 2400 should become 0000
        if ($hour > 23) $hour = 0;
    
        // leading zero
        if ($hour < 10) $hour = '0' . $hour;
    
        return $hour . $minute;
    }
    
    echo military_time();
    

    可能还可以改进。

    【讨论】:

      【解决方案4】:

      你可以试试

      $times = array("0030","0100","0130","0200");
      
      echo "<pre>";
      echo militaryTime($times, "0020"), PHP_EOL;
      echo militaryTime($times, "0050"), PHP_EOL;
      echo militaryTime($times, "0144"), PHP_EOL;
      echo militaryTime($times, "0146"), PHP_EOL;
      echo militaryTime($times, "0220"), PHP_EOL;
      

      输出

      0030
      0100
      0130
      0200
      0200
      

      使用的功能

      function militaryTime($times, $selected) {
          if (empty($times))
              trigger_error("Empty array not supported ");
          $times[] = $selected;
          sort($times);
          $position = array_search($selected, $times, true);
          $current = DateTime::createFromFormat("Hi", $times[$position]);
          $previous = isset($times[$position - 1]) ? DateTime::createFromFormat("Hi", $times[$position - 1]) : null;
          $next = isset($times[$position + 1]) ? DateTime::createFromFormat("Hi", $times[$position + 1]) : null;
      
          if ($previous != null && $next == null) {
              return $previous->format("Hi");
          }
          if ($previous == null && $next != null) {
              return $next->format("Hi");
          }
      
          $closest = ($current->diff($previous)->format("%i") - $current->diff($next)->format("%i") <= 0) ? $previous : $next;
          return $closest->format("Hi");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-15
        • 1970-01-01
        • 1970-01-01
        • 2020-03-09
        • 1970-01-01
        • 2020-05-07
        • 2021-05-11
        • 1970-01-01
        相关资源
        最近更新 更多