检测两个数字范围是否发生冲突

Jac*_*ght 5 php math range

希望这是一个非常简单的数学问题.如果我有两个数字范围,检查它们是否发生冲突的最简单,最有效的方法是什么,例如:

10-20 and 11-14 // clash as B is contained in A
11-15 and 20-22 // don't clash
24-26 and 20-30 // clash as A is contained in B
15-25 and 20-30 // clash as they overlap at each end
Run Code Online (Sandbox Code Playgroud)

我目前有这个烂摊子,但必须有一个更简单的方法来做这个检查:

$clash = ($b1 >= $a1 && $b1 <= $a2)
    || ($b2 >= $a1 && $b2 <= $a2)
    || ($a1 >= $b1 && $a1 <= $b2)
    || ($a2 >= $b1 && $a2 <= $b2);
Run Code Online (Sandbox Code Playgroud)

Dan*_*den 11

好吧,首先要确保你有完好的配对(无论如何,这可能是一个好主意,取决于你打算用它们做什么):

if($a1 > $a2) {
    // swap $a1 and $a2
    $temp = $a1;
    $a1 = $a2;
    $a2 = $temp;
}
if($b1 > $b2) {
    // swap $b1 and $b2
    $temp = $b1;
    $b1 = $b2;
    $b2 = $temp;
}
Run Code Online (Sandbox Code Playgroud)

然后你应该能够简化为:

$clash = ($a2 <= $b1) || ($a1 >= $b2);
Run Code Online (Sandbox Code Playgroud)

编辑:哎呀,倒退了!尝试:

$clash = !(($a2 <= $b1) || ($a1 >= $b2));
Run Code Online (Sandbox Code Playgroud)

  • 或者,没有否定:`$ clash =($ b1 <= $ a2)&&($ a1 <= $ b2) (6认同)

小智 9

我认为它应该像这样简单:

clash = A_LOW <= B_HIGH AND A_HIGH >= B_LOW
Run Code Online (Sandbox Code Playgroud)