4. díl - 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

V minulém dílu seriálu tutoriálů se základy PHP jsme si vysvětlili základy práce s proměnnými. Dnes s nimi budeme 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:

Jmenuji se $jmeno \n S tímto "jménem" jsem spokojen.

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.devbook.cz">devbooku</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 ;';

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 \n S 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.devbook.cz\">devbooku</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:

Třetí známka v poli je 3

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:

Můj průměr je: 2.5

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:

Ahoj, dnes je 2. říjen 2013

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. Příště si naprogramujeme svou první formulářovou aplikaci, bude to jednoduchá kalkulačka.


 

  Aktivity (3)

Článek pro vás napsal David Čápka
Avatar
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 se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (36 hlasů) :
4.916654.916654.916654.916654.91665


 


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

 

 

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

Avatar
Erik
Člen
Avatar
Erik:

Zdravím, nevíte někdo, proč mi to nefunguje? Kód by měl být totožný...

 
Odpovědět 16. ledna 12:38
Avatar
Erik
Člen
Avatar
Odpovídá na Erik
Erik:

Zdravím, nevíte někdo, proč mi to nefunguje? Kód by měl být totožný... Musím místo "\n" použít tag br, ale i tak, vysvětlí mi někdo, proč "\n" nefunguje? Děkuji

 
Odpovědět 16. ledna 12:44
Avatar
Rasťo Suchovský:

Už to tu bolo viackrát spomenuté:

V kódě se ti odřádkuje (k tomu slouží \n), ale to HTML přečte shodně jako mezeru, takže se text neodřádkuje.
Musíš použít


, které slouží k odřádkování textu na stránce, ne kódu.

 
Odpovědět  +1 23. ledna 0:09
Avatar
Odpovídá na Rasťo Suchovský
Rasťo Suchovský:

ops, nejako to zblblo:
treba použiť:
kokos, neviem to napísať :(

"je menší ako"br /"je väčší ako"

je menší ako = <
je väčší ako = >

 
Odpovědět 23. ledna 0:12
Avatar
Rasťo Suchovský:

A-hááá

<br />
 
Odpovědět  +1 23. ledna 0:13
Avatar
jirka.skop
Člen
Avatar
jirka.skop:

Ahoj,potřebuju seřadit a vypsat pole čísel,ale našel sem jen výpis přes "print_r"(ten to výpíše i s klíči
Array ( [0] => 0 [1] => 2 [2] => 6 [3] => 8 ).
Já bych chtěl aby to vypadalo takhle:
0,2,6,8
Už se stím trápím pár dní a nikde nemůžu nic najít.Díky za odpověd.

 
Odpovědět 20. února 14:14
Avatar
arkill
Člen
Avatar
Odpovídá na jirka.skop
arkill:

seřazení http://php.net/….sorting.php
vypsání obsahu pole:

 implode(',', $array);
echo $string
Editováno 20. února 21:05
 
Odpovědět 20. února 21:02
Avatar
arkill
Člen
Avatar
arkill:
$string = implode(',', $array);
echo $string
 
Odpovědět 20. února 21:06
Avatar
David Hynek
Redaktor
Avatar
Odpovídá na Erik
David Hynek:

lomítka řádků se projeví ve zdrojovém kódu stránky, když chceš zalomit řádek na stránce musíš přidat příkaz pro HTML :)

Odpovědět 20. února 21:19
Čím víc vím, tím víc věcí nevím.
Avatar
Jakub Mrázek:

Čute všichni, mám problém pochopit:

$mesicSlovy = $mesice[$mesic - 1];

proč mezi $mesice a tím druhým nic není, když to chci použít do mého kódu:

$rok = $znameni[$dnesrok - 1];

tak mi to vypíše chybu, ale přitom to je v podstatě to samé.

 
Odpovědět 9. května 14:08
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 90. Zobrazit vše