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

私は現在この混乱を抱えていますが、このチェックを行うためのはるかに簡単な方法があるはずです:

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

5 に答える 5

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));
于 2009-09-08T22:10:41.457 に答える
9

私はそれがこれと同じくらい単純であるべきだと思います:

clash = A_LOW <= B_HIGH AND A_HIGH >= B_LOW
于 2009-09-08T22:11:48.147 に答える
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 => $ 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;
  }
  else {
    $ 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;
}

于 2011-01-25T15:13:50.090 に答える
2

$ a2 <=$b1または$a1>= $ b2の場合に限り、範囲が衝突することはありません(範囲が順序対として指定されていると仮定)。次に、条件を無効にします。

于 2009-09-08T22:07:05.583 に答える
0

あなたが探しているのは、配列の交差点です。http://us3.php.net/array_intersect

基本的に、

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

$arr1と$arr2の両方に要素がある場合、$intersectはそれらの値を一覧表示します。count()呼び出しは1(またはそれ以上)を返すので、> 0を実行すると、$arr1と$arr2に同様の要素があるかどうかがわかります。

于 2009-09-08T22:23:29.107 に答える