Klávesnice zdarma Klávesnice zdarma
Pořádné programy s pořádnou klávesnicí zdarma. Více zde
Pouze tento týden sleva až 80 % na C# .NET

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

PHP Základní konstrukce Textové řetězce podruhé a pole v PHP American English version English version

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Proměnné a typový systém v PHP, jsme si vysvětlili základy práce s proměnnými. Dnes s nimi budeme v PHP tutoriálu pokračovat 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:

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

Výstup:

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:

$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.

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 klíčové slovo 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 takto:

$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 starší webhostingy.

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():

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 příští lekci, Asociativní pole v PHP a obsluha formulářů, si naprogramujeme svou první formulářovou aplikaci, bude to jednoduchá kalkulačka.


 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
60 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Miniatura
Předchozí článek
Proměnné a typový systém v PHP
Miniatura
Všechny články v sekci
Základní konstrukce jazyka PHP
Miniatura
Následující článek
Cvičení k 1.-4. lekci PHP
Aktivity (10)

 

 

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

Avatar
František Kreisinger:4.3.2018 9:52

Vyjádřil jsem se špatně. Měl jsem napsat "... jak zapsat ECHO tak, aby se text na webové stránce zobrazil prohlížečem přesně tak, jak je napsaný tj. .... a ne zobrazený už jako odkaz.".
Je to vlastně dotaz spíš k HTML nežli k PHP. Odpověď je: místo znaků < > použít entity &lt &gt.

Odpovědět 4.3.2018 9:52
Začátečník v PHP, HTML i webovém programování vůbec.
Avatar
František Kreisinger:4.3.2018 14:04

Proč print_r($znamky); tady v ukázce vypíše jednotlivé prvky pole hezky odřádkovaně, ale mně je namastí všechny do jednoho řádku?

Odpovědět 4.3.2018 14:04
Začátečník v PHP, HTML i webovém programování vůbec.
Avatar
Odpovídá na František Kreisinger
František Kreisinger:18.3.2018 16:56

To, co se tady jako ukázka výstupu print_r($znamky) zobrazuje je výstup, jak ho udělá PHP (ne jak bude zobrazený na webové stránce), tedy odřádkovaný pomocí ENTER. Na webové stránce se ale to odřádkování ENTERem samozřejmě neudělá. Abych docílil stejného výpisu na webové stránce, musím přidat HTML tagy např.:

echo "<PRE>";
print_r($znamky);
echo "</PRE>";

Odpovědět  +1 18.3.2018 16:56
Začátečník v PHP, HTML i webovém programování vůbec.
Avatar
Petr Staněk
Člen
Avatar
Petr Staněk:13.11.2018 15:02

Já musel situaci řešit takto:
<?php
$jmeno = 'Karel';
$text = "Jmenuji se $jmeno
S tímto jménem jsem spokojen.
";
echo($text);
?>
Za použití "\n" mi to pouze "\n" vypsalo do textu...
Je to způsobeno jazykem HTML nebo je chyba někde na mé straně??

 
Odpovědět 13.11.2018 15:02
Avatar
Petr Zajac
Člen
Avatar
Odpovídá na Petr Staněk
Petr Zajac:13. února 10:37

chělo by to "celou část stránky" já to s "\n" zkoušel a nezobrazuje se mi.
Navíc jsem nepochopil, proč používat "\n" když to ve výsledné stránce stejně neodřádkuje a musí se použít "
" ?!?

 
Odpovědět 13. února 10:37
Avatar
Niesomtu Hraskova:14. února 15:08

Mam dotaz, skusam si php kody podla tutorialu na stranke http://phptester.net/

 
Odpovědět 14. února 15:08
Avatar
Niesomtu Hraskova:14. února 15:14

Mam dotaz, skusam si php kody podla tutorialu na stranke http://phptester.net/ a pri tomto kode s escapovanim apostrofu mi to pise error na riadku so zapisom toho stringu: konkretny kod je tento:

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

Neviete mi niektopovedat preco to vnima ako zle zapisany string ?
php tam je 7.0

 
Odpovědět 14. února 15:14
Avatar
Jan Poláček
Redaktor
Avatar
Odpovídá na Niesomtu Hraskova
Jan Poláček:14. února 18:57

Ahoj, to co si napsala v příspěvku je správně, online tester ale zpětné lomítko odebere a v tu chvíli samozřejmě končí řetězec dříve a hodí to chybu. Asi bych zkoušel na lokálním serveru typu WAMP,XAMPP... Návod tu určitě je.

Odpovědět 14. února 18:57
Instrukce na adrese 0x77104f29 odkazovala na adresu paměti 0x00000014. S pamětí nelze provést operaci: written.
Avatar
Odpovídá na Jan Poláček
Niesomtu Hraskova:14. února 20:55

Jasne hah som sa cudovala prave nad tym ze po kazdom spusteni toho kodu mi to zo skriptu odstranilo lomitko, dobre vediet, dik za radu..P.S: mam xamp a viem pouzivat aj vb aj zvlast inplementovat do pc ostatne sucasti problem mam skorej ten ze mam shitny pc a preto ked mam toho vela na nom pootvaraneho tak radsej pouzivam online sluzbu a na spominanej stranke mi prekvapivo zatial vsetko okrem escapovania bez problemov fici.

 
Odpovědět 14. února 20:55
Avatar
Endemarich Kopolikov:17. února 21:20

Zdravím. Trošku jsem se dnes začal učit podle tohoto tutorialu a hned jsem narazil na problém.
Po tomto kódu:

<?php
$znamky = [];
$znamky[] = 2;
$znamky[] = 3;
$znamky[] = 2;
$znamky[] = 1;
print_r($znamky);
?>

se mě pole v prohlížeči vygenerovalo neodřádkované:

Array ( [0] => 2 [1] => 3 [2] => 2 [3] => 1 )

Nevíte někdo co dělám špatně?

 
Odpovědět 17. února 21:20
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 110. Zobrazit vše