2009-09-08 25 views
5

這是一個非常簡單的數學問題。如果我有兩個號碼的範圍,什麼是檢查最簡單,最有效的方式,如果他們發生衝突,如:檢測兩個數字範圍是否衝突

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); 

回答

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)); 
+0

我只是想發佈:-) +1更快。 – 2009-09-08 22:11:46

+6

或者沒有否定:'$ clash =($ b1 <= $ a2)&&($ a1 <= $ b2)' – sth 2009-09-08 22:19:16

+0

謝謝,那很好。 – 2009-09-08 22:28:17

2

當且僅當$ a2 < = $ b1或$ a1> = $ b2(假定範圍按有序對給出)時,範圍不會發生衝突。現在否定條件。

+1

如果$ a1> = $ b2怎麼辦?然後也不衝突。 – 2009-09-08 22:08:27

+0

我們也假設它始終是$ a1 <$ a2和$ b1 <$ b2的情況。 – 2009-09-08 22:10:37

+0

@Matthew:Right @jeffamaphone:那麼,這就是你的意思是「範圍」,不是嗎? – 2009-09-08 22:39:55

7

我覺得應該是這樣簡單:

clash = A_LOW <= B_HIGH AND A_HIGH >= B_LOW 
0

什麼你要找的是數組的交集。 http://us3.php.net/array_intersect

基本上,

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

如果任何元素都在這兩個$ ARR1和$ ARR2,那麼$相交將列出這些值。 count()調用返回1(或更多),所以如果$ arr1和$ arr2有任何相似的元素,那麼> 0會給你。

3

例如:
10 - 20
4 - 5 //這將與上述
40衝突 - - 11 //這將與上述
1衝突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爲$ each_index => $ each_x){
    //獲得在y對應的值
    $ this_y = $ y_array [$ each_index];
    echo「$ this_y < $ max_val」;;
   如果($ each_x> $ MAX_VAL & & $ this_y> $ MAX_VAL){
        $ MAX_VAL = $ this_y;
   }
   否則{
        $ last_x = $ x_array [$ last_index];
        $ last_y = $ y_array [$ last_index];
          echo「Error:Overlap between :($ each_x,$ this_y)and($ last_x,$ last_y)」;
   }
    $ last_index = $ each_index;
}