测试一个范围是否与另一个数字范围相交
Test if a range intersects another range of numbers
我有 2 个数字范围:
$startTime
到 $endTime
$offerStartTime
到 $offerEndTime
以上变量均为整数
我想看看 offerStartTime
到 offerEndTime
的范围是否在 startTime
和 endTime
范围内。
例如,如果 startTime
和 endTime
范围是:10 到 20,则以下示例范围将 return 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
以下将 return false
:
offerStartTime: 1, offerEndTime: 3
offerStartTime: 90, offerEndTime: 100
offerStartTime: 1, offerEndTime: 10
offerStartTime: 20, offerEndTime: 100
我该怎么做?
理想情况下会喜欢 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;
}
?>
您可以使用 range
和 array_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';
}
这是一张代表重叠和非重叠的所有可能性的图片,以直观地说明为什么会这样。
根据您的输入和预期的错误输出,我使用了 <
和 >
。如果您还想包括在某个点相交的范围,则需要改用 <=
和 >=
。
我有 2 个数字范围:
$startTime
到$endTime
$offerStartTime
到$offerEndTime
以上变量均为整数
我想看看 offerStartTime
到 offerEndTime
的范围是否在 startTime
和 endTime
范围内。
例如,如果 startTime
和 endTime
范围是:10 到 20,则以下示例范围将 return 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
以下将 return false
:
offerStartTime: 1, offerEndTime: 3
offerStartTime: 90, offerEndTime: 100
offerStartTime: 1, offerEndTime: 10
offerStartTime: 20, offerEndTime: 100
我该怎么做? 理想情况下会喜欢 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;
}
?>
您可以使用 range
和 array_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';
}
这是一张代表重叠和非重叠的所有可能性的图片,以直观地说明为什么会这样。
根据您的输入和预期的错误输出,我使用了 <
和 >
。如果您还想包括在某个点相交的范围,则需要改用 <=
和 >=
。