Php 测试一个范围是否与另一个数字范围相交
我有两个数字范围:Php 测试一个范围是否与另一个数字范围相交,php,numbers,range,pseudocode,Php,Numbers,Range,Pseudocode,我有两个数字范围: $startTime至$endTime $offerStartTime至$offerndime 上述每个变量都是整数 我想看看提供的开始时间到提供的结束时间的范围是否在开始时间和结束时间的范围内 例如,如果startTime和endTime的范围为:10到20,则以下示例范围将返回true: 报价开始时间:5,报价结束时间:11 报价开始时间:5,报价结束时间:100 报价开始时间:10,报价结束时间:15 报价开始时间:10,报价结束时间:100 报价开始时间:12,
至$startTime
$endTime
至$offerStartTime
$offerndime
提供的开始时间
到提供的结束时间
的范围是否在开始时间
和结束时间
的范围内
例如,如果startTime
和endTime
的范围为:10到20,则以下示例范围将返回true
:
报价开始时间:5,报价结束时间:11
报价开始时间:5,报价结束时间:100
报价开始时间:10,报价结束时间:15
报价开始时间:10,报价结束时间:100
报价开始时间:12,报价结束时间:15
报价开始时间:19,报价结束时间:100
false
:
报价开始时间:1,报价结束时间:3
报价开始时间:90,报价结束时间:100
报价开始时间:1,报价结束时间:10
报价开始时间:20,报价结束时间: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范围内,因此返回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;
}
?>
您可以使用
范围
和数组_相交
,即:
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数组
,其中包含基于4变量(开始、结束)的数字,然后使用array\u intersect
检查这两个数组是否有相同的数字,如果输出为而非空,我们知道数字(时间)重叠。/$startTime到$endTime
//$offerStartTime至$offerEndTime
//您可以使用普通比较器来比较php时间,所以这只是一个逻辑问题。这是解决办法。
//好的,让我们首先确保两个时间都不在范围内,因为如果是,我们知道它已经很好了
如果($offerStartTime<$endTime&&offerStartTime>$startTime)| |($OfferdTime<$endTime&&OfferdTime>$startTime)){
返回true;
}
//所以它不容易已经在范围内,所以我们必须测试,如果较低的一个低于开始的一个,但另一个高于。即。
其他($OFFERSTARTIME<$startTime)&($OFFERSTARTIME>$startTime)){
返回true;
}
//因此,唯一其他可接受的可能性是,提供的开始时间低于结束时间,而提供的结束时间高于ie
其他($offerStartTime<$endTime)和($offerEndTime>$endTime)){
返回true;
}
//所以我们已经用尽了所有其他有效的可能性,它一定是假的
否则{
返回false;
}
过了一段时间,我找到了一个似乎有效的简单解决方案(如果无效,请随时告诉我)
($offerStartTime$startTime)||
($offerStartTime>$startTime&$offerStartTime<$endTime)
我还将寻找比我的答案更好的答案,因此请仍然将您的解决方案发送给我。如果您只是检查报价的任何部分是否与范围的任何部分重叠,这很简单
if ($offerStartTime < $endTime && $offerEndTime > $startTime) {
echo 'The ranges overlap';
}
if($offerStartTime<$endTime&$offerEndTime>$startTime){
回声“范围重叠”;
}
下面的图片展示了重叠和非重叠的所有可能性,以直观地了解其工作原理
根据您的输入和预期的错误输出,我使用了
。如果您还想包括在某一点相交的范围,则需要使用=
。是否处理unix时间戳?如果是这样的话,您应该使用DateTime
classists实际上是一天中的秒数。i、 e.0到86400在一个函数中运行一个循环,该函数从开始时间到结束时间接收开始、结束时间、offerstart、offerend、循环,直到开始>=结束,并测试offerstart/offerend是否在其中一个循环内显示5
是否介于10
和20
之间?而100
?@abracadver5
是提供的开始时间
是提供的开始时间
是11
。两个数字之间的范围都在10
到20
之间,特别是10
和11
之间。你知道我认为你可能是对的。在所有这些复杂的答案之后,lol。让我等一等,看看是否有任何情况下这不起作用,然后再对此进行表决。您的代码将无法与$outerRange=['start'=>15,'end'=>25]代码>例如,因此它不是一个解决方案
($offerStartTime <= $startTime && $offerEndTime > $startTime) ||
($offerStartTime > $startTime && $offerStartTime < $endTime)
if ($offerStartTime < $endTime && $offerEndTime > $startTime) {
echo 'The ranges overlap';
}