Jistě jste si všimli, že na mnoha www stránkách najdete informaci, kdo
zrovna dnes slaví či zítra oslaví svůj svátek. Proč byste takto nezpestřili
(je-li to vzhledem k povaze stránek vhodné) i své stránky...
Co vlastně níže uvedený "svátkovací" PHP skript dělá?
Skript zjistí aktuální číslo dne v roce (0-365) a podívá se do pole (array
$svatky), kde máme uloženy svátky pro jednotlivé dny. Stejným způsobem je
možno zjistit také kdo měl svátek například včera nebo bude mít zítra.
Výsledný skript zobrazí např. (je-li dnes 6. 1.):
Včera měl/a svátek Dalimil, dnes jsou Tři králové, zítra
má svátek Vilma
Pokud se chceme podívat i na včerejšek či zítřek, nastává první
drobná komplikace. Pokud je například 1. ledna (číslo dne je tedy 0 (z
čehož plyne první prvek pole $svatky) a chceme-li se podívat o den zpět,
index pole by byl -1 - tedy neexistující. Den předcházející 1. lednu je přece
31. prosinec, kterému odpovídá index 365. Tento problém řeší funkce cycleint($cislo),
která zajistí, že je-li předpokládaný index mimo povolený rozsah (0-365), návratová
hodnota funkce odpovídá takovému indexu, aby skutečně po 31. prosinci následoval
1. leden a 1. lednu předcházel 31. prosinec.
Druhá komplikace souvisí s přestupnými, resp. nepřestupnými
roky. Pokud je rok přestupný, vše je bez problémů, protože rok má 366 dní,
tj. stejně jako máme prvků v poli. Pokud je rok nepřestupný, je třeba
ignorovat svátek pro 29. února - tj. 60. prvek pole (s indexem 59) $svatky vždy
přeskočit, tj. je-li získané číslo dne >=59, je třeba k němu přičíst
jedničku. Toto zařizuje funkce posun($cislo).
Jak je vidět v příkladu výše, skript ví, kdy má zobrazit text "měl/a
svátek", "jsou" či "má svátek". Toto zajišťuje
funkce hlaska($cislo,$minulost=0), která na základě čísla dne (již
upraveného funkcemi posun a cycleint) přiřadí příslušný
text (hlášku). Pokud se text (hláška) má týkat dne z minulosti (včera, předevčírem...),
je třeba jako druhý parametr funkce hlaska($cislo,$minulost=0) zadat 1.
Pokud chceme text v přítomném čase, není třeba 2. parametr zadávat, neboť
je standardně (defaultně) nastaven na 0.
Vše vám bude zřejmější po zhlédnutí zdrojového kódu:
<?
$svatky=array(
'Nový rok',
'Karina',
'Radmila',
//...dalsi dny...
//kompletní seznam - viz zdrojový kód ke stažení
'Judita',
'David',
'Silvestr');
function posun($cislo)
{
//pokud není přestupný a získané číslo dne >=59
if (!date("L") && $cislo>=59)
return $cislo+1;
else
return $cislo;
}
function cycleint($cislo, $min=0, $max=365)
{
if ($cislo>$max)
$cislo=$min+($cislo-$max-1);
if ($cislo<$min)
$cislo=$max-($min-$cislo-1);
return $cislo;
}
function hlaska($cislo, $minulost=0)
{
switch($cislo):
case 5:
$hlaska=$minulost?"byli":"jsou";
break;
case 0:
case 121:
case 128:
case 186:
case 187:
case 306:
case 359:
$hlaska=$minulost?"byl":"je";
break;
default:
$hlaska=$minulost?"měl/a svátek":"má svátek";
endswitch;
return $hlaska;
}
$today=date("z"); //funkcí date() získané číslo dne
//zjištění korektních indexů
$vcera=cycleint(posun($today-1));
$dnes=cycleint(posun($today));
$zitra=cycleint(posun($today+1));
echo "Včera ".hlaska($vcera,1)." ".$svatky[$vcera].", dnes "
.hlaska($dnes)." ".$svatky[$dnes].", zítra "
.hlaska($zitra)." ".$svatky[$zitra];
?>
|
Jak je z kódu zřejmé, je zde dvakrát použita standardní PHP funkce date()
a to s parametrem "z" (vrací den v roce v intervalu 0-365)
a s parametrem "L" (vrací 1 pokud se jedná o přestupný rok,
jinak vrací 0). Ve funkci hlaska jsou explicitně vyjmenovány dny, u
nichž je třeba vypsat jiný než standardní text a ve větvi default
je definován text pro ostatní případy. Podmíněný operátor (podmínka?pravda:nepravda)
pak zajišťuje výběr mezi verzí textu v přítomném či minulém čase.
Ve výše uvedeném kódu není vypsán kompletní seznam svátků (jmen),
neboť by to článek značně prodloužilo a znepřehlednilo. Zde
si můžete stáhnout kompletní zdrojový kód (vč. seznamu svátků) nebo se
můžete podívat
kdo měl, dnes má a zítra bude mít svátek.
Pecka Miroslav
|