Autor | Zpráva | ||
---|---|---|---|
hal_sk Profil |
#1 · Zasláno: 24. 12. 2010, 01:50:30 · Upravil/a: hal_sk
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 |
#2 · Zasláno: 24. 12. 2010, 01:57:12
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 |
#3 · Zasláno: 24. 12. 2010, 02:29:58
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 |
#4 · Zasláno: 24. 12. 2010, 02:59:45 · Upravil/a: xmark
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 |
#5 · Zasláno: 24. 12. 2010, 03:13:22 · Upravil/a: TomášK
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 |
#6 · Zasláno: 24. 12. 2010, 03:35:03
„č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 |
#7 · Zasláno: 24. 12. 2010, 13:06:38 · Upravil/a: hal_sk
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 |
#8 · Zasláno: 24. 12. 2010, 13:15:40 · Upravil/a: hal_sk
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 |
#9 · Zasláno: 24. 12. 2010, 13:35:22
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 |
#10 · Zasláno: 24. 12. 2010, 13:44:53
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 |
#11 · Zasláno: 24. 12. 2010, 14:05:56
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 |
#12 · Zasláno: 24. 12. 2010, 14:11:04
Áno máš true :-)
|
||
Časová prodleva: 13 let
|
0