测试一个范围是否与另一个数字范围相交

Test if a range intersects another range of numbers

我有 2 个数字范围:

以上变量均为整数

我想看看 offerStartTimeofferEndTime 的范围是否在 startTimeendTime 范围内。

例如,如果 startTimeendTime 范围是:10 到 20,则以下示例范围将 return true:

以下将 return false:

我该怎么做? 理想情况下会喜欢 PHP 中的答案,但伪代码也可以。

希望这对您有所帮助,我已经根据您的所有输入进行了尝试,并且运行良好..

<?php

ini_set('display_errors', 1);

$startTime=10;
$endTime=20;

$startOffset=100;
$endOffset=110;

$range=range($startTime,$endTime);//getting range of time

$offsetRange=range($startOffset,$endOffset);//getting range of offset


$set=array_intersect($range, $offsetRange);//getting the intersection

if(is_array($set) && count($set)>0);
{
    if(count($set)>1)
    {
        echo "Matched";
    }
    //added this to prevent this case offerStartTime: 1, offerEndTime: 10, 
    //ranges intersection is the endTime
    elseif(count($set)==1)
    {
        if($set[0]!=$startTime)
        {
            echo "Matched";
        }
    }
}

您需要测试较小范围的起点是否大于或等于较大范围的起点,以及较小范围的终点是否小于或等于较大范围的终点:

在这种情况下,10-20 属于 5-25,因此 returns 正确。如果您不想包含范围的端点,只需将 <=>= 分别更改为 <>

<?php

$innerRange = ['start' => 10, 'end' => 20];
$outerRange = ['start' => 5, 'end' => 25];

echo isInRange($innerRange,$outerRange);

function isInRange($innerRange,$outerRange) {
    if ($innerRange['start'] >= $outerRange['start'] && $innerRange['end'] <= $outerRange['end'] ) {
         return true;   
    }
    return false;
}

?>

您可以使用 rangearray_intersect,即:

function time_intersect($startTime, $endTime, $offerStartTime, $offerEndTime)
{
    $start_to_end = range($startTime, $endTime, 1);
    $offer_start_end = range($offerStartTime, $offerEndTime, 1);
    if (!empty(array_intersect($start_to_end, $offer_start_end)))
    {
      # time overlaps
      return true;
    }
}

解释:

使用 range 我们创建 2 arrays 包含基于 4 变量(开始、结束), 然后我们使用 array_intersect 检查 2 个数组是否有共同的数字,如果输出 not 为空,我们知道数字(时间)重叠。

//$startTime to $endTime
//$offerStartTime to $offerEndTime
//you can compare php times by using normal comparators so this is just a logic problem. here's the solution.


//ok let's start by making sure that neither offered time is within the range because if it is we KNOW it's already good so

if(($offerStartTime < $endTime && offerStartTime > $startTime) || ($offerEndTime < $endTime && offerEndTime > $startTime)){
      return true;
 }
 //so it's not easily already within the range so we have to test if the lower one is under the starting one but the other is above. ie.
elseif(($offerStartTime < $startTime) && ($offerEndTime > $startTime)){
     return true; 
}
//so the only other acceptable possibility is that the offered start time is lower than the endtime and the offered end time is higher ie
elseif(($offerStartTime < $endTime) && ($offerEndTime > $endTime)){
      return true;
}
//so we've exhausted all other valid possibilities it must be false
else{
      return false;
}

一段时间后,我找到了一个似乎有效的高效简单解决方案(如果无效,请随时告诉我)。

($offerStartTime <= $startTime && $offerEndTime > $startTime) ||
($offerStartTime > $startTime && $offerStartTime < $endTime)

我也会寻找比我更好的答案,所以请把你的解决方案发给我。

如果您只是检查报价的任何部分是否与范围的任何部分重叠,这很简单。

if ($offerStartTime < $endTime && $offerEndTime > $startTime)  {
    echo 'The ranges overlap';
}

这是一张代表重叠和非重叠的所有可能性的图片,以直观地说明为什么会这样。

根据您的输入和预期的错误输出,我使用了 <>。如果您还想包括在某个点相交的范围,则需要改用 <=>=