2009-09-08 5 views
5

これはうまくいけば、非常に簡単な数学の質問です。私は現在、この混乱を持って2つの数値範囲が衝突するかどうかを検出する

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 

が、このチェックを行うにははるかに簡単な方法がなければならない:私は2つの番号範囲を持っている場合、彼らは衝突する場合など、チェックするための最も簡単かつ効率的な方法何

のみなら$ A2 < = $ B1または$ A1> = $ B2(範囲は順序対として与えられると仮定して)場合
$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

私はちょうどそれを投稿しようとしていました。 –

+6

または否定なしで: '$ clash =($ b1 <= $ a2)&&($ a1 <= $ b2) ' – sth

+0

ありがとう、それは素晴らしいです。 –

2

範囲は衝突しません。今度は条件を否定します。

+1

$ a1> = $ b2の場合はどうなりますか?それでもどちらもぶつかりません。 –

+0

また、常に$ a1 <$ a2と$ b1 <$ b2の場合を想定しています。 –

+0

@Matthew:右 @ jeffamaphone:まあ、それはあなたが "範囲"を意味するのですね。 –

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から11 //これは1
上記と衝突します - たとえば、2列に
50店のオーナー数 - これは上記と衝突します// 5
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";
    IF($ 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 "エラー:($ each_x、$ this_y)と($ last_x、$ last_y)の間に重複があります。
   }
    $ last_index = $ each_index;
}