2009-09-08 10 views
5

Jest to, miejmy nadzieję, bardzo proste pytanie matematyczne. Jeśli mam dwa zakresy numeryczne, co jest najprostszym i najbardziej skutecznym sposobem, aby sprawdzić, czy one kolidować, np:Wykrywanie, czy zdarzą się dwa zakresy numerów

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 

Obecnie mam ten bałagan, ale nie musi być znacznie prostszy sposób, aby zrobić ten test:

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

Odpowiedz

11

Cóż, najpierw upewnij się, że dobrze zorganizowany pary (prawdopodobnie dobrym pomysłem, w zależności od tego, co masz zamiar zrobić z nich):

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

Następnie powinieneś być w stanie uprościć do:

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

Edit: Ups, mam ten test w tył! Spróbuj:

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

Właśnie napisałem :-) +1 za bycie szybszym. –

+6

lub bez negacji: '$ clash = ($ b1 <= $ a2) && ($ a1 <= $ b2)' – sth

+0

Dzięki, to świetnie. –

2

zakresy nie kolidowały wtedy i tylko wtedy $ a2 < = $ lub $ b1 a1> = $ b2 (zakładając, że zakresy są podane jako uporządkowanych par). Teraz zaneguj ten warunek.

+1

Co jeśli $ a1> = $ b2? Nie koliduje wtedy. –

+0

Przyjmujemy również, że zawsze jest tak, że $ a1

+0

@Matthew: Right @jeffamaphone: Cóż, to masz na myśli przez "zasięg", prawda? –

7

myślę, że powinno być tak proste, jak to:

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

Co szukasz jest przecięcie tablic. http://us3.php.net/array_intersect

Zasadniczo

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

Jeśli jakiekolwiek elementy są zarówno $ i $ arr2 arr1, następnie $ przecinają będzie lista tych wartości. Wywołanie count() zwraca 1 (lub więcej), więc wykonanie> 0 daje ci, jeśli $ arr1 i $ arr2 mają jakiekolwiek podobne elementy.

3

przykład:
10 - 20
4 - 11 // będzie kolidować z wyżej
1 - 5 // będzie kolidować z powyższych
40 - 50
magazynu numerów w tablicach 2, np
x_array = array (10,4,11,40);
y_array = array (20,11,5,50);

($ x_array); // posortuj tylko pierwsze wartości z zakresu x i zachowaj indeks
$ max_val = -1;
$ last_index = 0;
foreach ($ x_array jak $ each_index => $ each_x) {
    // uzyskać odpowiednie wartości 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 "Błąd: nakładanie się pomiędzy: ($ each_x, $ this_y) i ($ last_x, $ last_y)";
   }
    $ last_index = $ each_index;
}