Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET
Využij akce až 80% zdarma při nákupu e-learningu. Více informací .
BF summer

Lekce 4 - Textové řetězce podruhé a pole v PHP

V minulé lekci, Proměnné a typový systém v PHP, jsme si vysvětlili základy práce s proměnnými.

Dnes se naučíme zadávat textové řetězce různými způsoby 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 za pomocí klávesy SHIFT a klávesy na obrázku:

Apostrof

Kód s apostrofy může vypadat třeba takto:

$jmeno = 'Karel';
$text = 'Jmenuji se $jmeno \n S tímto "jménem" jsem spokojen.';
echo($text);

A jako výstup dostaneme:

Your page
localhost

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:

$jmeno = 'Karel';
$text = 'Jmenuji se ' . $jmeno . ' \n S tímto "jménem" jsem spokojen.';
echo($text);

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ů:

echo('PHP se učím z tutoriálů na <a href="http://www.itnetwork.cz">ITnetwork</a>.');

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 píše na české klávesnici pomocí pravého ALT a písmene Q:

Zpětné lomítko

V kódu by edescapování vypadalo takto:

$text = 'Chvilku mi trvalo, než jsem na klávesnici našel znaky ", \' a ;';
echo($text);

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é:

$jmeno = 'Karel';
$text = "Jmenuji se $jmeno \nS tímto jménem jsem spokojen.";
echo($text);

Výstup bude následující:

Jmenuji se Karel
S tímto jménem jsem spokojen.

Do textu se vložila hodnota proměnné $jmeno. Také vidíte, že se nevypsala sekvence \n. 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áte do zdrojového kódu vygenerované stránky, tak ho tam uvidíte.

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Zpracování uvozovek je samozřejmě z důvodu zpracování proměnných o něco pomalejší, ale vaše aplikace to nijak neovlivní. Můžete si tedy používat tu variantu, která vám vyhovuje. Dvojité uvozovky se určitě nehodí na výpis HTML. Lze v nich totiž psát apostrofy, ale uvozovky se musí escapovat:

echo("PHP se učím z tutoriálů na <a href=\"http://www.itnetwork.cz\">ITnetwork</a>.");

Varianta výše je velmi nepřehledná. Osobně používám skoro pořád apostrofy a proměnné vkládám pomocí konkatenace (tečky). Přijde mi to přehlednější.

Ještě pro úplnost dodám, ž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 jako ž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ů, 10 známek ze školy, platy 100 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 2 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 (ono mimochodem vnitřně opravdu tak 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 bude v jedné přihrádce třeba číslo a v 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 8 čísel:

Pole v PHP

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 tak, co v ní je a v množném čísle, tedy v našem případě $znamky. Pro samotnou definici pole používáme funkci array().

$znamky = array();

Nyní je v proměnné $znamky prázdné pole. Pokud používáte PHP 5.4 nebo novější, můžete pole zapsat i s hranatými závorkami [].

 Hranaté závorky se na české klávesnici napíši pomocí klávesy pravý ALT a písmeny F a G:

Hranaté závorky

Definování pole s hranatými závorkami by vypadalo následovně:

$znamky = [];

Tento zápis je kratší a obecně lepší, ale já se budu držet starší definice, jelikož někteří čtenáři mohou používat webhostingy se starší verzi 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:

Podtržítko

Nyní vypíšeme pole $znamky pomocí funkce print_r():

print_r($znamky);

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. Nemá to zde samozřejmě žádný smysl, jen ten, že si to vyzkoušíme :) To za dvěma lomítky je 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 to 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:

echo('Třetí známka v poli je ' . $znamky[2]);

Výstup:

Your page
localhost

Praktické ukázky použití polí

PHP nám nabízí pro práci s poli spoustu funkcí. I když 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:

$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);

Výstup programu:

Your page
localhost

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:

$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");

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:

Your page
localhost

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.-4. lekci PHP, si procvičíme nabyté zkušenosti z předchozích lekcí.


 

Předchozí článek
Proměnné a typový systém v PHP
Všechny články v sekci
Základní konstrukce jazyka PHP
Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
73 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 13 let. Má rád Nirvanu, sushi a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity (24)

 

 

Komentáře
Zobrazit starší komentáře (128)

Avatar
Jan Koloničný:20.3.2020 15:12

Ahoj,
Mám jen takový dotaz ze zajímavosti. Proč při výběru dne používáme do závorky "j" a nepoužíváme "d" když předpokládám, že to je začáteční písmenko u roku "Y"ear, u měsíce "M"onth. Pokud použiji "D"ate, tak mi to funguje stejně.
Můžu tedy používat d nebo tam je nějaké skryté nebezpečí?
Díky

 
Odpovědět
20.3.2020 15:12
Avatar
Odpovídá na Jan Koloničný
Matěj Přerovský:20.3.2020 16:22

Když máš 'j' tak tam nejsou zbytečné nuly (ne 01. ... ale 1. ...) kdežto u 'd' jsou. Viz dokumentace

Odpovědět
20.3.2020 16:22
42
Avatar
Odpovídá na Matěj Přerovský
Rico ThreeDmax:1.5.2020 22:01

zajímavý že já je tam mám

 
Odpovědět
1.5.2020 22:01
Avatar
Odpovídá na Rico ThreeDmax
Rico ThreeDmax:1.5.2020 22:09

to je sice hezký že tam u j nejsou nuly ale u m nula je. Takže když chci zapsat číslama např 1.5 tak dostanu 1.05

 
Odpovědět
1.5.2020 22:09
Avatar
Samuel Hél
Tým ITnetwork
Avatar
Odpovídá na Rico ThreeDmax
Samuel Hél:11.6.2020 15:18

Pokud chceš měsíc zapsat čísly bez nul na začátku, použij místo písmene "m" písmeno "n".

 
Odpovědět
11.6.2020 15:18
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Jiří Cejn
Člen
Avatar
Jiří Cejn:3. března 9:36

Já nějak nechápu, proč si Češi pořád komplikujou život klávesnicí QWERTZ. Nastavte si klávesnici QWERTY a všechny spešl znaky máte napsaný přímo na klávesnici a napíšete je s pomocí AltGr nebo Shift+AltGr.

 
Odpovědět
3. března 9:36
Avatar
Jan Kropáč
Člen
Avatar
Jan Kropáč:5. března 20:54

Hezký večer :)
Tohle jsem vytvořil. Pro jistotu jsem nakopíroval celý kód, no problém je až v samém závěru. Neřádkuje.. :( viz obrázek)

Díky za reakci JK.

<?php
        // put your code here

        echo('<br />');
        $jmeno='Frantu';
        $text='Až uvidíte '.$jmeno.' \n pozamykejte "všecky" dveře.';
        echo($text);
        echo('<br />');
        echo('<br />');
        echo('Šrotím kódy PHP na sajtach <a hrref="https://www.itnetwork.cz/">'
                . 'ITnetwork</a>');
        echo('<br />');
        echo('<br />');
        $text2='Když chcu, aby byl vidět apostrof, to je tohle " \' "'
                . ', musím tam vrazit obrácené lomítko. Před něj...';
        echo($text2);

        echo('<br />');
        echo('<br />');

        $text3="Až uvidíte $jmeno \npozamykejte všecky dveře.";
        echo($text3);

        echo('<br />');
        echo('<br />');

        $jmeno2 = 'Karel';
        $text4 = "Jmenuji se $jmeno2 \nS tímto jménem jsem spokojen.";
        echo($text4);

        ?>
 
Odpovědět
5. března 20:54
Avatar
Jarda
Člen
Avatar
Odpovídá na Jan Kropáč
Jarda:17. března 10:07

Ale řádkuje, jen jinde než zřejmě očekáváš.
\n odřádkuje v zdrojovém kódu, ne na zobrazené stránce.
Koukni se na řádek 14 a 15, to je odřádkování pomocí \n

 
Odpovědět
17. března 10:07
Avatar
Samuel Hél
Tým ITnetwork
Avatar
Odpovídá na Jan Kropáč
Samuel Hél:18. března 11:20

Přesně jak psal Jarda, odřádkuje ti to zdroják. Kdyby jsi nechal vypsat php soubor např. v konzoli, tam by se ti to odřádkovalo. HTML využívá na odřádkování značku <br>.

 
Odpovědět
18. března 11:20
Avatar
Dušan Kovářík:16. června 5:33

Zatím pořád jednoduché a srozumitelné. Trochu si musím zvykat na ten $ před názvem proměnných, ale zase to má (možná, nevím) výhodu, že nemusím řešit, jestli náhodou nepoužívám pro název proměnné třeba název nějaké vestavěné funkce nebo tak něco... Zprvu se mi to na PHP nelíbilo, ale má to něco do sebe, na první pohled je vizuálně rozlišitelné, že se jedná o proměnnou a ne něco jiného. Funkce date() taky trochu nezvyk, že je to funkce a ne objekt, ale zase je to jednoduché a dobře se to pamatuje.

 
Odpovědět
16. června 5:33
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 138. Zobrazit vše