Проверьте, пересекает ли диапазон другой диапазон чисел

У меня 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, но псевдокод будет в порядке.

2

Решение

Если вы просто проверяете, перекрывает ли какая-либо часть предложения какую-либо часть диапазона, это просто.

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

Вот картина, представляющая все возможности наложения и не наложения, чтобы визуализировать, почему это работает.

введите описание изображения здесь

Основываясь на ваших входах и ожидаемых ложных результатах, я использовал < а также >, Если вы хотите также включить диапазоны, которые пересекаются в точке, вам нужно будет использовать <= а также >= вместо.

2

Другие решения

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

Вам нужно проверить, больше или меньше начало вашего меньшего диапазона, чем начало вашего большего диапазона И, если ваш конец меньшего диапазона меньше или равен концу вашего большего диапазона:

В этом случае 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;
}

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

Ты можешь использовать 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 массива общие числа, если вывод не пусто, мы знаем, что числа (время) перекрываются.

0

Через некоторое время я нашел эффективное простое решение, которое, кажется, работает (не стесняйтесь сказать мне, если это не так).

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

Я также буду искать ответы, которые лучше моих, поэтому, пожалуйста, пришлите мне свое решение.

0
По вопросам рекламы [email protected]