Adottak a hét napjai (H, K, Sze, Cs, P, Szo, V), valamint egy adattábla, benne minden rekordhoz két nap. Számítsuk ki, hogy a két nap között hány-hány nap van. (Pl. hétfőtől péntekig, majd péntektől hétfőig eltelő napok száma.)
A nem javasolt
megoldás: veszünk egy külső switch case szerkezetet, amelynél az eseteket az első napok szerint alakítjuk. Hét eset. Majd ezek mindegyikében egy újabb switch case, aszerint, hogy a második nap mi. 72 = 49 eset.
switch ($elsonap) {
case 'H':
switch ($masodiknap)
case 'K': echo '1 ill 6 nap van koztuk'; break;
case 'Sze': echo '2 ill 5 nap van koztuk'; break;
...
case 'K':
switch ($masodiknap)
case 'H': echo '6 ill 1 nap van koztuk'; break;
case 'Sze': echo '1 ill 6 nap van koztuk'; break;
...
...
}
Ez tényleg nem túl jó, egyrészt a 49 elágazás miatt, másrészt mert ha mondjuk angolul is ki akarjuk írni az eredményeket akkor már 2*49 elágazásunk lesz. Egy fokkal jobb megoldás, ha a napokhoz számokat társítunk, majd ezeket kivonogatjuk egymásból mod 7:
switch ($nap) {
case 'H': $n = 1;
case 'K': $n = 2;
...
}
Csakhogy ezt a társítást lehet switch case nélkül is, és ezúttal egy végleges, immáron meglehetősen rövid és komplett megoldás:
function eltelt_napok($napchar1, $napchar2) {
$napok = array('H' => 1, 'K' => 2, 'Sze' => 3, ...);
$nap1 = $napok[$napchar1];
$nap2 = $napok[$napchar2];
$diff1 = mod(max($nap1, $nap2) - min($nap1, $nap2), 7);
$diff2 = mod(min($nap1, $nap2) - max($nap1, $nap2), 7);
return array($diff1, $diff2);
}
A mod fv természetesen megvalósítandó vmi tetszőleges módon. Lehet hogy a php-ben van is rá vmi, én hirtelen nem találtam, úgyhogy:
function mod($n, $q) {
$n %= $q;
if ($n < 0)
$n += $q;
return $n;
}
Update 17:13: sőt a mod fv is elhagyható, ld. tbela kommentje.