PHP选择最接近变量

时间:2012-11-06 23:04:36

标签: php

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

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

4 个答案:

答案 0 :(得分:3)

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

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

  1. 剥离46(分钟)
  2. 与30
  3. 取绝对差异
  4. 如果差异> 15,将下一个可用时隙用于0146 (这是0200)
  5. 如果差异<= 15,则采用0146之前的先前可用时间 (这是0130)
  6. 希望这有帮助。

答案 1 :(得分:0)

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

你有144,你想要向下舍入到130,或146,到200.同样,14(0014)将转到0(0000)和15(0015)到30。

简单如果/ thens足以完成此任务。

答案 2 :(得分:0)

我相信应该这样做:

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();

虽然可能会改进。

答案 3 :(得分:0)

你可以尝试

$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");
}