这是一个非常简单的数学问题。如果我有两个数字范围,检查它们是否发生冲突的最简单,最有效的方法是什么,例如:
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);
答案 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是否有任何类似的元素。