Autor Zpráva
hal_sk
Profil
Zdravím.
Niekedy sa stane, že potrebujem testovať či sú 2 dátumy (od do) v medziach iného dátumu (rozsahu) od do. Pritom test vráti true aj vtedy, ak niektorý z testovaných dátumov je mimo rozsah, pričom druhý dátum ale musí byť v rozsahu. Neviem či mi je rozumieť. Tu je jeden funkčný príklad na ilustráciu len z číslami:
<?php
$cislo_A=7;
$cislo_B=10;
$rozsah_od=5;
$rozsah_do=15;

if($cislo_A<=$cislo_B && $rozsah_od<=$rozsah_do) 
{
 if
 (
 ($cislo_A>=$rozsah_od && $cislo_A<=$rozsah_do && $cislo_B>=$rozsah_od && $cislo_B<=$rozsah_do)
 OR
 ($cislo_A<=$rozsah_od && $cislo_B>=$rozsah_od || $cislo_B>=$rozsah_do && $cislo_A<=$rozsah_do)
 )
 {
  echo "testovany rozsah je cely v hlavnom rozsahu, alebo don ciastocne zasahuje";
 }
}
else
{
 echo "chybne vstupne data";
}

/*
priklady testovania:

$cislo_A=7;
$cislo_B=10;;
pravda

$cislo_A=2;
$cislo_B=10;
pravda

$cislo_A=7;
$cislo_B=39;;
pravda

$cislo_A=3;
$cislo_B=4;
NEpravda

$cislo_A=18;
$cislo_B=24;
NEpravda
*/
 
?>

Pýtam sa, existuje na takéto testovanie nejaký jednoduchší postup, než testovať všetky možné prípady?
xmark
Profil
Zamysli se, co vlastně potřebuješ porovnat.
1. Ověř, jestli $cislo_A < $cislo_B. Jestli ne, tak je chybně zadání.
2. Jestli ano, tak stačí ověřit:

$rozsah_od < $cislo_A
$cislo_B < $rozsah_do

Kde má být ostrá a kde neostrá nerovnost, to si doplň sám.
hal_sk
Profil
xmark:
1. Ověř, jestli $cislo_A < $cislo_B. Jestli ne, tak je chybně zadání.
Upravil som to.
Existuje funkcia typu is_between(), pre takéto testovanie?
xmark
Profil
hal_sk:
Existuje funkcia typu is_between(), pre takéto testovanie?
Ne.
Dodatek: když použiješ můj postup, kde potřebuješ between?
TomášK
Profil
hal_sk:
Existuje funkcia typu is_between(), pre takéto testovanie?
Pokud ano, čekal bych název spíš in_range(). Pokud ji nenajdeš v dokumentaci, není nic jednoduššího než si napsat vlastní.

xmark:
$rozsah_od < $cislo_A < $rozsah_do < cisloB dle zadání vyhovuje, tvé řešení ho myslím označí jako nevyhovující.


Mé řešení:
function prunik($a, $b, $od, $do) {
    /* kontrola vstupu */
    if($a > $b || $od > $do) {
        return null;
    }

    $a_v_intervalu = ($a > $od) != ($a < $do);
    $b_v_intervalu = ($b > $od) != ($b < $do); 

    return $a_v_intervalu || $b_v_intervalu;
}


Google:
function overlaps($first_start, $first_end, $second_start, $second_end) {
    return !(
        ($first_start < $second_start && $first_end < $second_start)
        ||
        ($first_start > $second_end && $first_end > $second_end)
    );
}


Vyber si hezčí.
xmark
Profil
či sú 2 dátumy (od do) v medziach iného dátumu (rozsahu) od do

TomášK:
$rozsah_od < $cislo_A < $rozsah_do < cisloB dle zadání vyhovuje

Určitě?
hal_sk
Profil
TomášK:
Dík. To tvoje riešenie mi pomohlo. Len som ho trocha upravil:
function prunik($a, $b, $od, $do) {
    /* kontrola vstupu */
    if($a > $b || $od > $do) {
        return null;
    }

    $a_v_intervalu = ($a >= $od) == ($a <= $do);
    $b_v_intervalu = ($b >= $od) == ($b <= $do); 

    return $a_v_intervalu || $b_v_intervalu;
}

Som nevedel že sa dajú testovať hodnoty na trua a false aj mimo konštrukcie if.
hal_sk
Profil
Ešte taký pod-dotaz. Prečo v prípade nesprávnych vstupných hodnôt ($a>$b), funkcia vracia false a nie null:
<?php
$x=prunik(15, 10, 20, 40);

switch ($x)
{
 case true:
 echo "true";
 break;
 
 case false:
 echo "false";
 break;
 
 case null:
 echo "null";
 break;
}


function prunik($a, $b, $od, $do) {
    /* kontrola vstupu */
    if($a > $b || $od > $do) {
        return null;
    }

    $a_v_intervalu = ($a >= $od) == ($a <= $do);
    $b_v_intervalu = ($b >= $od) == ($b <= $do); 

    return $a_v_intervalu || $b_v_intervalu;
}
?>


A ďalšia pod-otázka trocha off-topic, keď funkcia vráti hodnotu, znamená to, že zbytok kódu vo funkcii pod return sa nevykonáva, že?
fuckin
Profil
hal_sk:
A ďalšia pod-otázka trocha off-topic, keď funkcia vráti hodnotu, znamená to, že zbytok kódu vo funkcii pod return sa nevykonáva, že?
Správně.



Ešte taký pod-dotaz. Prečo v prípade nesprávnych vstupných hodnôt ($a>$b), funkcia vracia false a nie null:
Protože jestli proměnná má hodnotu null, tak při porovnání s hodnou false to vrátí pravdu. Jelikož false je ekvivalentní k null, platí to i obráceně, null k false.
hal_sk
Profil
fuckin:
Aha, takže potom je lepšie zvoliť takúto kontrolu:
if($x===TRUE)
{
 echo "true";
}
elseif($x===FALSE)
{
 echo "false";
}
else
{
 echo "null";
}
fuckin
Profil
Ano pokud chceš rozlišit false a null. Nicméně v praxi mě to přijde zbytečné, k čemu porovnávat jestli je to FALSE nebo NULL? Neúspěch je jen jeden, nevidím potřebu ho dělit na dva typy.
hal_sk
Profil
Áno máš true :-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0