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

时间:2017-04-25 16:25:16

标签: php numbers range pseudocode

我有两个数字范围:

  • $startTime$endTime
  • $offerStartTime$offerEndTime

以上每个变量都是整数。

我想查看范围offerStartTimeofferEndTime是否属于startTimeendTime范围。

例如,如果startTimeendTime范围为:10到20,则以下示例范围将返回true

  • offerStartTime: 5, offerEndTime: 11
  • offerStartTime: 5, offerEndTime: 100
  • offerStartTime: 10, offerEndTime: 15
  • offerStartTime: 10, offerEndTime: 100
  • offerStartTime: 12, offerEndTime: 15
  • offerStartTime: 19, offerEndTime: 100

以下内容将返回false

  • offerStartTime: 1, offerEndTime: 3
  • offerStartTime: 90, offerEndTime: 100
  • offerStartTime: 1, offerEndTime: 10
  • offerStartTime: 20, offerEndTime: 100

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

6 个答案:

答案 0 :(得分:2)

如果您只是检查优惠的任何部分是否与范围的任何部分重叠,那很简单。

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

这是一张图片,表示重叠和非重叠的所有可能性,以显示其工作原理。

enter image description here

根据您的输入和预期的错误输出,我使用了<>。如果您还希望包含某个点相交的范围,则需要使用<=>=代替。

答案 1 :(得分:1)

//$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;
}

答案 2 :(得分:0)

希望这会帮助你,我已经尝试了所有你的输入,它工作正常..

<?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";
        }
    }
}

答案 3 :(得分:0)

您需要测试较小范围的起点是否大于或等于较大范围的起点并且如果较小范围的结尾小于或等于较大范围的结尾:

在这种情况下,10-20落在5-25之内,所以返回true。如果您不想包含范围的端点,只需将<=>=分别更改为<>

<?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;
}

?>

答案 4 :(得分:0)

您可以使用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我们根据 4 变量(开始,结束)创建包含数字的 2 arrays,然后我们使用{{1检查2个数组是否有共同的数字,如果输出为空,我们知道数字(时间)重叠。

答案 5 :(得分:0)

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

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

我也会看到比我更好的答案,所以请向我发送你的解决方案。