У меня 2 диапазона номеров:
$startTime
в $endTime
$offerStartTime
в $offerEndTime
Каждая из вышеуказанных переменных является целым числом.
Я хочу увидеть, если диапазон offerStartTime
в offerEndTime
попадает в диапазон startTime
а также endTime
,
Например, если startTime
а также endTime
диапазон был: от 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, но псевдокод будет в порядке.
Если вы просто проверяете, перекрывает ли какая-либо часть предложения какую-либо часть диапазона, это просто.
if ($offerStartTime < $endTime && $offerEndTime > $startTime) {
echo 'The ranges overlap';
}
Вот картина, представляющая все возможности наложения и не наложения, чтобы визуализировать, почему это работает.
Основываясь на ваших входах и ожидаемых ложных результатах, я использовал <
а также >
, Если вы хотите также включить диапазоны, которые пересекаются в точке, вам нужно будет использовать <=
а также >=
вместо.
//$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;
}
Вам нужно проверить, больше или меньше начало вашего меньшего диапазона, чем начало вашего большего диапазона И, если ваш конец меньшего диапазона меньше или равен концу вашего большего диапазона:
В этом случае 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;
}
?>
Надеюсь, что это поможет вам, я пробовал это со всеми вашими входами, и он работает нормально ..
<?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";
}
}
}
Ты можешь использовать 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 массива общие числа, если вывод не пусто, мы знаем, что числа (время) перекрываются.
Через некоторое время я нашел эффективное простое решение, которое, кажется, работает (не стесняйтесь сказать мне, если это не так).
($offerStartTime <= $startTime && $offerEndTime > $startTime) ||
($offerStartTime > $startTime && $offerStartTime < $endTime)
Я также буду искать ответы, которые лучше моих, поэтому, пожалуйста, пришлите мне свое решение.