Iki sayı çatışma aralıkları ise tespit

4 Cevap php

Bu umarım çok basit bir matematik soru. Ben iki sayı aralıkları varsa, ne, örneğin çatışma olmadığını kontrol etmek için basit ve en etkili yoludur:

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

Şu anda bu karışıklığı var, ancak bu denetimi yapmak için çok daha basit bir yolu olmalı:

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

4 Cevap

Peki, ilk emin (onlarla yapmak planı ne bağlı zaten muhtemelen iyi bir fikir,) iyi sıralı çiftleri var olun:

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

Sonra size basitleştirmek mümkün olmalıdır:

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

Edit: Whoops, geriye bu testi var! Deneyin:

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

Ben bu kadar basit olması gerektiğini düşünüyorum:

clash = A_LOW <= B_HIGH AND A_HIGH >= B_LOW

Aralıkları çatışma ETMEYİN eğer sadece ve sadece $ a2 <= $ b1 veya a1 $> (aralıkları sipariş çiftleri olarak verilmiş olduğunu varsayarak) = $ b2. Şimdi durumu inkâr.

Ne aradığınız dizilerin kavşak olduğunu. http://us3.php.net/array_intersect

Temel olarak,

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

Herhangi elemanları $ dizi1 ve $ dizi2 hem de varsa, o zaman $ kesiştiği bu değerleri listeler. Sayısı () çağrısı böylece> 0 yaparken, 1 (veya daha fazla) döndürür $ dizi1 ve $ dizi2 herhangi benzer unsurları varsa verir.