Letní akce PHP týden
Pouze tento týden sleva až 80 % na kurzy PHP. Lze kombinovat s akcí Letní slevy na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!

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

Unicorn College 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.
Předchozí článek
Proměnné a typový systém v PHP
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 (12)

 

 

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

Avatar
Jan Nemec
Člen
Avatar
Jan Nemec:2. června 17:25

Ahoj prosim o radu,

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

?>
utika mi vyznam count proc se **array_sum** deli **count**? To neumi automaticky
vyplivnout spravne cislo array_sum?

Dekuji
Editováno 2. června 17:25
 
Odpovědět 2. června 17:25
Avatar
Jindřich Máca
Tým ITnetwork
Avatar
Odpovídá na Jan Nemec
Jindřich Máca:2. června 18:27

Ahoj, no jak se počítá průměr čísel? :D

průměr = součet_všech_čísel / počet_všech_čísel

A to přesně dělá uvedený kód. Tedy pole $znamky je nějaký seznam čísel, PHP funkce array_sum() je všechny sečte a funkce count() vrátí jejich počet v daném seznamu, nebo-li velikost onoho pole. :)

 
Odpovědět 2. června 18:27
Avatar
Jan Nemec
Člen
Avatar
Odpovídá na Jindřich Máca
Jan Nemec:2. června 18:32

Uz chapu - dekuji

 
Odpovědět  +1 2. června 18:32
Avatar
Mikoláš Chromík:20. června 19:35

To odřádkování mi nefunguje ani na Netbeans :)

 
Odpovědět 20. června 19:35
Avatar
Jaroslav Smrž
Redaktor
Avatar
Odpovídá na Mikoláš Chromík
Jaroslav Smrž:21. června 8:38

Jaké odřádkování?

Odpovědět 21. června 8:38
I have no idea what it is doing but I´m scared to delete it... xD
Avatar
Jaroslav Smrž
Redaktor
Avatar
Odpovídá na Mikoláš Chromík
Jaroslav Smrž:21. června 8:41

Pokud myslíš zalomení řádku, tak to se v php provádí pomocí \n, ale většinou ho musíš odescapovat. Důležité je správné použití " " a ' ' . Pokud nevíš jak, přečti si znovu základy syntaxe php. Bez toho se neobejdeš.

Editováno 21. června 8:43
Odpovědět 21. června 8:41
I have no idea what it is doing but I´m scared to delete it... xD
Avatar
Odpovídá na Mikoláš Chromík
Tomáš Novotný:21. června 8:57

Ahoj pro "new line" znak je v php konstanta PHP_EOL, která by se měla měnit dle platformy... tj. "\r\n" pro Win nebo "\n" pro Linux like prostředí. Ve většině případů je to Linux, takže se to asi tak nehrotí a píše se rovnou "\n" do textu.

Odpovědět 21. června 8:57
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
Mikoláš Chromík:21. června 15:49

Já to právě mám tak jak se v tutoriálu uvádí :-D zkusil jsem i "\r\n" ... nevím proč to nejde, tak jsem tam strčil tag br

Editováno 21. června 15:50
 
Odpovědět 21. června 15:49
Avatar
Odpovídá na Mikoláš Chromík
Tomáš Novotný:21. června 16:07

Pokud je výstupem html a koukáš na to v prohlížeči tak znak "\n" nebo "\r\n" sice ve zdrojovém kódu bude, ale prohlížeč podle něj výstup neformátuje, podobně se nezobrazí několik mezer za sebou.. tedy pokud to neobalíš párovým <pre> nebo <xmp> tagem
pokud by výstupem byl třeba textový soubor a ten si prohlížel v nějakém editoru, tak ten nový řádek zobrazí...
podobně to bude fungovat pokud bys php pouštěl z příkazové řádky/terminálu.... prosté echo "\n" by odřádkovalo..

Odpovědět  +1 21. června 16:07
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
Odpovídá na Tomáš Novotný
Mikoláš Chromík:21. června 16:10

Jojo, tohle dává smysl :)

 
Odpovědět 21. června 16:10
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 127. Zobrazit vše