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

时间:2009-09-08 22:04:41

标签: 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

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

$clash = ($b1 >= $a1 && $b1 <= $a2)
    || ($b2 >= $a1 && $b2 <= $a2)
    || ($a1 >= $b1 && $a1 <= $b2)
    || ($a2 >= $b1 && $a2 <= $b2);

5 个答案:

答案 0 :(得分: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;
}

然后你应该能够简化为:

$clash = ($a2 <= $b1) || ($a1 >= $b2);

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

$clash = !(($a2 <= $b1) || ($a1 >= $b2));

答案 1 :(得分:9)

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

clash = A_LOW <= B_HIGH AND A_HIGH >= B_LOW

答案 2 :(得分:3)

例如:
10 - 20
4 - 11 //这将与上面发生冲突 1 - 5 //这将与上面发生冲突 40 - 50
将你的数字存储在2个阵列中,比如说 x_array = array(10,4,11,40);
y_array = array(20,11,5,50);

ASORT(x_array $); //仅对第一个x范围数组值进行排序并保持索引
$ max_val = -1;
$ last_index = 0;
foreach($ x_array as $ each_index =&gt; $ each_x){
//得到y对应值
$ this_y = $ y_array [$ each_index];
echo“$ this_y&lt; $ max_val”;
if($ each_x&gt; $ max_val&amp;&amp; $ this_y&gt; $ max_val){
$ max_val = $ this_y;
}
其他{
$ last_x = $ x_array [$ last_index];
$ last_y = $ y_array [$ last_index];
echo“错误:重叠:($ each_x,$ this_y)和($ last_x,$ last_y)”;
}
$ last_index = $ each_index;
}

答案 3 :(得分:2)

当且仅当$ a2&lt; = $ b1或$ a1&gt; = $ b2时,范围不会发生冲突(假设范围是按有序对给出的)。现在否定了这个条件。

答案 4 :(得分:0)

您正在寻找的是数组的交集。 http://us3.php.net/array_intersect

基本上,

$intersect = array_intersect($arr1, $arr2);
$clash = (count($intersect) > 0);

如果$ arr1和$ arr2中都有任何元素,那么$ intersect将列出这些值。 count()调用返回1(或更多),因此执行&gt; 0给出了$ arr1和$ arr2是否有任何类似的元素。