| 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: 16 let
|
|||
0