4

认为,

$at_time = '07:45:00';

$ranges = [
   ['start' => '09:00:00', 'end' => '17:00:00'],
   ['start' => '17:00:00', 'end' => '08:59:00']
];

现在我想检查是否$ranges包含$at_time

4

4 回答 4

4

我的 PHP 有点生疏了,但请尝试以下方法:

$matches=Array();

foreach($ranges as $i=>$ikey){
    if(strtotime($ranges[$i]['start']) < strtotime($at_time) && strtotime($ranges[$i]['end']) > strtotime($at_time)){
         array_push($matches,$i);
    }
}

然后$matches将包含一个包含所有范围的数组$at_time

于 2013-08-22T07:44:27.153 回答
3

这应该有效。

<?php

function arrayContainsTime($time, $ranges) {
    $target = strtotime($time);
    foreach($ranges as $range) {
        $start  = strtotime($range['start']);
        $end    = strtotime($range['end']);

        if($target > $start && $target < $end) {
            return 1;
        }
    }
    return 0;
}

$at_time      = '07:45:00';
$another_time = '10:30:45';

$ranges = [
   ['start' => '09:00:00', 'end' => '17:00:00'],
   ['start' => '17:00:00', 'end' => '08:59:00']
];


echo $at_time, " match? ", arrayContainsTime($at_time, $ranges);
echo "<br>";
echo $another_time, " match? ", arrayContainsTime($another_time, $ranges);

在这里看到它的行动!

注意:它不会正确检测 17:00:00 -> 08:59:00,因为没有包含日期​​。

于 2013-08-22T08:04:36.797 回答
3

注意:受上述@Jimmery 回答的启发。

您可以将其放入返回匹配范围false的函数中- 此外,它还有一个小优势,即它在第一次匹配时停止:

function timeInRange($at_time,$ranges)
{
    foreach($ranges as $i=>$ikey)
    {
        if(strtotime($ranges[$i]['start']) < strtotime($at_time) && strtotime($ranges[$i]['end']) > strtotime($at_time))
        {
            return $i;
        }
    }
    return false;
}
于 2013-08-22T08:02:46.557 回答
1

这应该给你一个方法

$time = str_replace(":","",$at_time);
foreach($ranges as $rangleval){
    $start = str_replace(":","",$rangleval['start']);
    $end = str_replace(":","",$rangleval['end']);
        if($start<=$time && $end>=$time){
            echo $at_time." lies between ".$rangleval['start']." and ".$rangleval['end'];
            break;
        }
    }
于 2013-08-22T07:43:51.903 回答