Lekce 5 - Textové řetězce podruhé a pole v PHP
V předchozím kvízu, Kvíz - Úvod do základů a proměnných v PHP, jsme si ověřili nabyté zkušenosti z předchozích lekcí.
Dnes se naučíme různými způsoby zadávat textové řetězce a představíme si pole.
Zápisy řetězců a escapování
V minulém dílu jsme si ukazovali, jak zapisovat textové řetězce. Víme, že je můžeme psát do apostrofů nebo uvozovek. Abychom mohli stavět na nějakých základech, vysvětleme si rozdíly v těchto dvou zápisech.
Apostrofy
Pokud napíšeme textový řetězec do apostrofů (jednoduchých uvozovek), vloží se do něj přesně ten text, který je uveden.
Apostrofy na české klávesnici napíšeme pomocí klávesy Shift a klávesy na obrázku:

Kód s apostrofy může vypadat třeba takto:
{PHP}
$jmeno = 'Karel';
$text = 'Jmenuji se $jmeno \n S tímto "jménem" jsem spokojen.';
echo($text);
{/PHP}
A jako výstup dostaneme:
Vidíme, že si PHP vůbec nevšímá znaku dolaru, dvojitých uvozovek ani zpětného lomítka (to si vysvětlíme dále).
Pokud chceme do řetězce v apostrofech vložit obsah nějaké proměnné, nemáme jinou možnost než použít operátor tečky:
{PHP}
$jmeno = 'Karel';
$text = 'Jmenuji se ' . $jmeno . ' \n S tímto "jménem" jsem spokojen.';
echo($text);
{/PHP}
Výhodu možnosti vložení dvojitých uvozovek do apostrofů pocítíme ve chvíli, kdy vypisujeme nějaké HTML. V něm se totiž používají dvojité uvozovky pro zápis atributů:
{PHP}
echo('PHP se učím z tutoriálů na <a href="http://www.itnetwork.cz">ITnetwork</a>.');
{/PHP}
Pokud bychom chtěli do textu vložit apostrof, musíme ho tzv. odescapovat,
aby si ho PHP nespletlo s ukončením řetězce. Escapování provedeme pomocí
zpětného lomítka \
.
Zpětné lomítko se na české klávesnici píše pomocí pravého Alt a písmene Q:

V kódu by odescapování vypadalo takto:
{PHP}
$text = 'Chvilku mi trvalo, než jsem na klávesnici našel znaky ", \' a ;';
echo($text);
{/PHP}
V proměnné je nyní uloženo:
Chvilku mi trvalo, než jsem na klávesnici našel znaky ", ' a ;
Uvozovky
Ukažme si nyní, k čemu se hodí uvozovky. Uvozovky jsou v PHP chytřejší apostrofy a do řetězce zapsaném pomocí uvozovek můžeme jednoduše vkládat proměnné:
{PHP}
$jmeno = 'Karel';
$text = "Jmenuji se $jmeno \nS tímto jménem jsem spokojen.";
echo($text);
{/PHP}
Výstup bude následující:
Do textu se vložila hodnota proměnné $jmeno
. Také vidíme,
že se nevypsala sekvence \
. To z toho důvodu, že pomocí
lomítka se v uvozovkách zapisují speciální znaky. Z těch základních je
\n
odřádkování a \t
tabulátor. V HTML se
odřádkování neprojeví, ale když se podíváme do zdrojového kódu
vygenerované stránky, tak ho tam uvidíme.
Zpracování uvozovek je samozřejmě z důvodu zpracování proměnných o něco pomalejší, ale naše aplikace to nijak neovlivní. Můžeme tedy používat tu variantu, která nám vyhovuje. Dvojité uvozovky se určitě nehodí na výpis HTML. Sice v nich lze psát apostrofy, ale uvozovky se musí escapovat:
{PHP}
echo("PHP se učím z tutoriálů na <a href=\"http://www.itnetwork.cz\">ITnetwork</a>.");
{/PHP}
Varianta výše je velmi nepřehledná. Osobně nám připadá přehlednější používat skoro pořád apostrofy a proměnné vkládat pomocí konkatenace (tečky).
Ještě pro úplnost dodáme, že pokud byste někdy potřebovali vypsat zpětné lomítko v uvozovkách, musíte zapsat dvě za sebou, jinak to bude PHP brát tak, že něco escapujete.
Pole
Představte si, že ve svém programu potřebujete uložit více proměnných
stejného typu. Např. česká jména měsíců, deset známek ze školy, platy
sta uživatelů nebo databázi tisíců firem. Asi tušíte, že bude nějaká
lepší cesta než začít zběsile bušit proměnné znamka1
,
znamka2
, znamka3
… A co kdyby se program rozšířil
a známek by bylo tisíc? A jak by se potom počítal průměr z těchto
známek?
Pro uložení více proměnných stejného typu nám PHP nabízí datovou strukturu, které se říká pole. V PHP jsou dva typy polí. Dnes si popíšeme první z nich.
Číselně indexovaná pole
Číselně indexované pole si můžeme představit jako řadu přihrádek
někde v paměti počítače (pole mimochodem vnitřně takto opravdu vypadá).
Přihrádky jsou číslované vždy od nuly a jejich číslům se říká
indexy. V programování víceméně vše začíná od nuly, ne nadarmo se
říká, že první dítě programátora je nulté Přihrádek můžeme mít, kolik
chceme, a můžeme si do nich uložit hodnoty libovolného typu, a to dokonce i
tak, že v jedné přihrádce bude třeba číslo a ve druhé text. V praxi by
to ovšem nemělo valný smysl.
Na obrázku níže vidíte znázorněné pole, ve kterém je uloženo osm čísel:

Zkusme si něco podobného naprogramovat, udělejme si zmíněné pole
známek. Známky opět napíšeme pevně do skriptu, jelikož ještě neumíme
formuláře. To napravíme hned v příští lekci
Pole si uložíme do klasické proměnné. Pojmenujeme ji v množném čísle
a podle obsahu, v našem případě tedy $znamky
. Pro samotnou
definici pole používáme funkci array()
.
$znamky = array();
Nyní je v proměnné $znamky
prázdné pole. Pokud používáme
PHP 5.4 nebo novější, můžeme pole zapsat i s hranatými závorkami
[]
.
Hranaté závorky se na české klávesnici napíšou pomocí klávesy pravý Alt a písmeny F a G:

Definování pole s hranatými závorkami by vypadalo následovně:
$znamky = [];
Tento zápis je kratší a obecně lepší, ale my se budeme držet starší definice, jelikož někteří čtenáři mohou používat webhostingy se starší verzí PHP.
Vkládání prvků do pole
Nyní do pole přidejme několik známek. Jak je zvykem, můžeme to udělat několika způsoby.
Nový prvek na konec pole přidáme takto:
$znamky[] = 1; $znamky[] = 2; $znamky[] = 5;
Výsledné pole tedy vypadá takto:
1, 2, 5
Funkce echo()
nám pole moc dobře nevypíše, ale můžeme si
ho nechat vypsat pomocí funkce print_r()
.
Podtržítko na české klávesnici napíšeme pomocí klávesy Shift a následujícího znaku:

Nyní vypíšeme pole $znamky
pomocí funkce
print_r()
:
{PHP}
$znamky = [];
$znamky[] = 1;
$znamky[] = 2;
$znamky[] = 5;
print_r($znamky);
{/PHP}
Stejně tak můžeme vložit prvek na konkrétní index v poli. Pokud prvek na tomto indexu už je, prostě se přepíše:
$znamky[0] = 1; $znamky[1] = 3; $znamky[2] = 5; $znamky[1] = 2; // Přepíše prvek na indexu 1 (3) na dvojku
Poslední řádek vloží na index 1
prvek 2
, tím
přepíše hodnotu 3
, která se na tento index již vložila na
druhém řádku. Zde to samozřejmě nemá žádný smysl, jen ten, že si
postup vyzkoušíme Za dvěma
lomítky se pak nachází tzv. komentář. PHP si těchto textů nevšímá a
slouží pro lepší orientaci programátorů v kódu. Určitě je dobrý nápad
komentáře používat. Dají se zapsat i na více řádků, a to takto:
/*
Tento text PHP ignoruje a platí
až do ukončení komentáře. Můžeme si tak popsat
složitější části programu, abychom nezapomněli,
jak jsme je mysleli, až ke kódu přijdeme za pár měsíců :)
*/
Pokud známky předem víme, můžeme pole vytvořit rovnou se zadáním jeho obsahu:
$znamky = array(1, 2, 3, 4, 2, 2, 1, 3, 2, 5);
Čtení hodnot z pole
Pokud z pole potřebujeme načíst nějakou hodnotu, uděláme to pomocí indexu:
{PHP}
$znamky = array(1, 2, 3, 4, 2, 2, 1, 3, 2, 5);
echo('Třetí známka v poli je ' . $znamky[2]);
{/PHP}
Výstup:
Praktické ukázky použití polí
PHP nám nabízí pro práci s poli spoustu funkcí. Ačkoli si je popíšeme až v dalších dílech, udělejme si jen takové dvě malé ochutnávky.
Průměr známek
Pomocí funkcí array_sum()
(součet) a count()
(počet) spočítáme průměr zadaných známek:
{PHP}
$znamky = array(1, 2, 3, 4, 2, 2, 1, 3, 2, 5);
$prumer = array_sum($znamky) / count($znamky);
echo('Můj průměr je: ' . $prumer);
{/PHP}
Výstup programu:
Asi si dokážete představit, jak špatně by byl program čitelný,
kdybychom pole neznali a psali
$soucet = $znamka1 + $znamka2 + $znamka3
… Nyní jsme jen
jednoduše vydělili součet prvků v poli jejich počtem.
České datum
Jak již bylo řečeno, do pole si můžeme uložit prakticky cokoli, třeba názvy měsíců. Můžeme potom vypsat uživateli aktuální datum, a to dokonce česky:
{PHP}
$mesice = array('leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec');
$den = date('j');
$mesic = date('m');
$mesicSlovy = $mesice[$mesic - 1];
$rok = date('Y');
echo("Ahoj, dnes je $den. $mesicSlovy $rok");
{/PHP}
V programu vytvoříme pole názvů měsíců. Dále si pomocí funkce
date()
zjistíme číslo dne, měsíce a roku. Do proměnné
$mesicSlovy
si budeme chtít uložit aktuální měsíc z pole.
Když je říjen (měsíc 10), máme v proměnné $mesic
hodnotu
10
. Prvek v poli s hodnotou "říjen"
má však index
9
, jelikož jsou číslované od nuly. Proto sáhneme na
přihrádku s indexem $mesic - 1
. Nakonec jen jednoduše vypíšeme
obsah proměnných. Kompletní práci s datem a časem se také naučíme
později.
Výstup:
K polím se budeme často vracet, je kolem nich ještě spoustu teorie. Víme však, že i když je teorie hezká věc, měli bychom dělat i něco praktického.
V následujícím cvičení, Řešené úlohy k 1.-5. lekci PHP, si procvičíme nabyté zkušenosti z předchozích lekcí.