Nová ukázka
Reset
Načíst z URL
Uložit a získat odkaz
Vztahuje se k…
Nevyplňujte
Napiště „nejsem robot“
▶
Přepnout zobrazení
Výsledek
<!doctype html> <head> <meta charset="utf-8"> <title>Základní kurz 9: Pole</title> <link rel="stylesheet" href="/css/main.css"> <link rel="icon" href="/favicon.ico"> <style> #navigace a[href="/zakladni-kurz\/9-pole"] { background: #0088CC; color: #fff; } </style> </head> <body> <div class="container"> <div id="obsah" class="col content"> <h1>Základní kurz 9: Pole</h1> V části o <a href="/zakladni-kurz/6-promenne%23datove-typy">datových typech</a> jsme mluvili o čtyřech skalárních typech a zmínili také existenci datového typu pole (Array). Přišel čas se na pole podívat blíže. <p>U skalárních typů jsme také zmínili, že oproti složeným obsahují pouze jednu dále nedělitelnou hodnotu (a proto se jmenují <i>skalární</i>). Pole je složený typ, bude tedy obsahovat více hodnot.<br> <h2 id="syntaxe"><a href="#syntaxe" class="zakotvit">↳</a> <span>Zápis pole</span></h2> <p>Pole se skládá z jednotlivých <i>prvků</i> a každý prvek je určený dvojicí <i>klíč</i> a <i>hodnota</i>. Jako příklad můžeme vzít tento základní kurz, který se skládá z jednotlivých kapitol:<br> <div class="pre"><pre class="jush-php">$zakladniKurz = array(1 => "Úvod", 2 => "Co je potřeba?", 3 => "Nastavení editoru", /* atd. */ );</pre></div><br> Pole se tedy definuje příkazem <code>array()</code>, do kterého zapíšeme jednotlivé prvky oddělené čárkami. Prvek se skládá z klíče a hodnoty, oddělených operátorem <code>=></code> (operátor přiřazení v poli). Za posledním prvkem pole čárka může být a nemusí. Prvky je možné psát všechny na jeden řádek, ale pokud jsou delší anebo jich je hodně, je lepší je dělit na řádky tak, jak je znázorněno v příkladu. <p>Od PHP 5.4 je možný i zkrácený zápis použitím hranatých závorek místo příkazu <code>array()</code>:<br> <div class="pre"><pre class="jush-php">$zakladniKurz = [1 => "Úvod", 2 => "Co je potřeba?", 3 => "Nastavení editoru", /* atd. */ ];</pre></div><br> Prvek pole lze také definovat pouze hodnotou, v tom případě mu PHP klíč přidělí automaticky. A to tak, že pokud v poli není ještě použitý žádný číselný klíč, dostane vkládaný prvek nulu (pozor, ne jedničku!), jinak dostane číslo o 1 vyšší, než nejvyšší již existující (nezáporný) číselný klíč. Tedy když třeba nejdřív vložíte prvek s klíčem 3 a pak vložíte jen hodnoty, PHP bude pokračovat 4, 5, 6, …<br> <div class="pre"><pre class="jush-php">// Následující definice $ovoce dají stejný výsledek: $ovoce = array("jablko", "hruška", "švestka"); $ovoce = array(0 => "jablko", 1 => "hruška", 2 => "švestka"); // Následující definice $vikend dají stejný výsledek: $vikend = array(6 => "sobota", 7 => "neděle"); $vikend = array(6 => "sobota", "neděle"); // neděle dostane klíč 7</pre></div><h2 id="typ-klice-hodnoty"><a href="#typ-klice-hodnoty" class="zakotvit">↳</a> <span>Typ klíče a hodnoty</span></h2> <p>Zatím jsme viděli pole, kde klíč je číslo a hodnota řetězec, ale už formulace o číselných klíčích výše naznačuje, že to není jediná možnost. <p><b>Hodnota prvku pole</b> může mít jakýkoliv datový typ. Cokoli může být v proměnné, může být i hodnotou pole. Dokonce i pole může být hodnota prvku jiného pole. <p><b>Klíč</b> může být typu <b>integer</b> (číslo) nebo <b>string</b> (řetězec). Zbývající skalární typy (float a bool) se při pokusu je použít jako klíč pole <a href="/zakladni-kurz/7-pretypovani#pravidla-int">přetypují</a> se na integer, NULL se změní na prázdný řetězec a ostatní typy (pole, objekt, resource) generují varování <i>Illegal offset type</i>. Není ale důvod se vůbec snažit jiné typy než čísla a řetězce jako klíče v poli používat. <p>Když je klíčem pole řetězec obsahující jen celé číslo, automaticky se zkonvertuje na to číslo typu integer. <p>Poli, kde klíče nejsou čísla, ale řetězce, se říká <i>asociativní pole</i>.<br> <h2 id="prvky"><a href="#prvky" class="zakotvit">↳</a> <span>Manipulace s prvky pole</span></h2> <p>Zadat pole tedy umíme, ale jak se dostaneme k hodnotám v poli? Velice jednoduše, za identifikaci pole napíšeme do hranatých závorek klíč požadovaného prvku:<br> <div class="pre"><pre class="jush-php">// Máme-li pole $zakladniKurz definované výše: echo $zakladniKurz[3]; // vypíše: Nastavení editoru</pre></div><br> Hodnoty prvků pole je možné číst i zapisovat, práce s prvky pole je stejná jako s normálními proměnnými. Přiřazení hodnoty do pole na nějaký už existující klíč přepíše hodnotu, která pod tím klíčem v poli byla. Přiřazení hodnoty neexistujícímu klíči vytvoří nový prvek pole s daným klíčem. Lze také klíč vynechat a napsat jen prázdné hranaté závorky, v tom případě se vytvoří nový prvek a klíč se mu přidělí automaticky způsobem popsaným výše. <p>Prázdné hranaté závorky samozřejmě nejde použít pro čtení z pole, generuje to chybu úrovně fatal error. Když se pokusíte přečíst z pole hodnotu klíče, který tam není, vrátí se hodnota <code>null</code> a generuje se poznámka (notice). Pro zjištění, jestli prvek pole existuje, je možné použít příkaz isset, o kterém jsme <a href="/zakladni-kurz/6-promenne#kontrola-existence">už mluvili</a>. <p>Ukázka:<br> <div class="pre"><pre class="jush-php"><?php $ovoce = array("jablko", "hruška", "švestka"); // Vypíše druhý prvek, tj. hruška echo $ovoce[1]; // Přidá nový prvek a přidělí mu první volný klíč, tj. 3 $ovoce[] = "meruňka"; // Přepíše hodnotu s klíčem 2 (švestka) $ovoce[2] = "broskev"; // Vloží novou hodnotu se zadaným klíčem $ovoce[9] = "švestka"; // Zkontrolujte, jak nyní vypadá pole var_dump($ovoce); ?></pre></div><h2 id="vicerozmerne"><a href="#vicerozmerne" class="zakotvit">↳</a> <span>Vícerozměrné pole</span></h2> <p>Jak jsme si řekli, prvkem pole může být dokonce i jiné pole. Pak vzniká tzv. vícerozměrné pole. Sice neplatí žádná speciální pravidla a analogicky se použije to, co jsme si ukázali už výše, ale pro začátečníky to může být matoucí, takže se na ně podíváme blíže. <p>Definice vícerozměrného pole:<br> <div class="pre"><pre class="jush-php">$texty = array ("en" => array("pozdrav" => "hello"), "cs" => array("pozdrav" => "ahoj"));</pre></div><br> Definovali jsme proměnnou $texty, která obsahuje pole s klíči "en" a "cs". Prvek "en" je pole, které má jeden prvek "pozdrav" s hodnotou "hello". Prvek "cs" je také pole s jedním prvkem "pozdrav", ale hodnotou "ahoj" <p><small>Poznámka: Jestli se divíte, proč je pro češtinu klíč "cs" a ne "cz", kód češtiny podle <a href="http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes">ISO 639-1</a> je cs</small> <p>Vypsání hodnoty z výše definovaného pole:<br> <div class="pre"><pre class="jush-php">echo $texty["cs"]["pozdrav"]; // ahoj</pre></div><br> Vložení pole do pole:<br> <div class="pre"><pre class="jush-php">$nemecky = array("pozdrav" => "hallo"); $texty["de"] = $nemecky; // Nebo i bez proměnné: $texty["de"] = array("pozdrav" => "hallo");</pre></div><h2 id="funkce-pro-pole"><a href="#funkce-pro-pole" class="zakotvit">↳</a> <span>Užitečné funkce při práci s poli</span></h2> <p>Funkcí pro práci s poli je <a href="http://cz2.php.net/manual/en/ref.array.php">hodně</a>, podíváme se jen na několik těch nejčastěji používaných.<br> <h3 id="funkce-count"><a href="#funkce-count" class="zakotvit">↳</a> <span>count</span></h3><br> Jednou z nejčastěji používaných je funkce <a href="http://www.php.net/function.count">count</a>, která vrátí počet prvků v poli.<br> <div class="pre"><pre class="jush-php"><?php $ovoce = array("jablko", "hruška", "švestka"); echo count($ovoce); // 3 ?></pre></div><br> U vícerozměrných polí je možné nastavit druhý parametr na COUNT_RECURSIVE (je to název konstanty, takže bez uvozovek), v tom případě count započítá i všechny prvky vnořených polí. <div class="pre"><pre class="jush-php"><?php $texty = array ("en" => array("pozdrav" => "hello"), "cs" => array("pozdrav" => "ahoj")); echo count($texty); // 2 prvky "en" a "cs" echo count($texty, COUNT_RECURSIVE); // 4, "en", "cs", "en"/"pozdrav" a "cs"/"pozdrav ?></pre></div><h3 id="funkce-implode-explode"><a href="#funkce-implode-explode" class="zakotvit">↳</a> <span>implode a explode</span></h3> <p>Funkce <a href="http://www.php.net/function.implode">implode</a> převezme jako parametry oddělovač (řetězec) a pole a vrátí řetězec, ve kterém jsou vypsané všechny hodnoty pole, oddělené zadaným oddělovačem. <p>Opakem je funkce <a href="http://www.php.net/function.explode">explode</a>, která převezme oddělovač a text (řetězce) a text podle oddělovačů rozdělí do pole, které vrátí. <div class="pre"><pre class="jush-php"><?php $tvaryText = "trojúhelník, čtverec, kruh"; $ovocePole = array("jablko", "hruška", "švestka"); $tvaryPole = explode(", ", $tvaryText); $ovoceText = implode(", ", $ovocePole); var_dump($tvaryPole); var_dump($ovoceText); ?></pre></div><h3 id="funkce-sort"><a href="#funkce-sort" class="zakotvit">↳</a> <span>sort a deriváty</span></h3> <p>Seřadí pole. Návratová hodnota je jen true/false (úspěch/neúspěch) a seřazeno bude pole, které je předáno v parametru funkce. Původní klíče v poli se zahodí a setříděné pole bude mít nové klíče vzestupně od 0. <div class="pre"><pre class="jush-php"><?php $ovoce = array("jablko", "hruška", "švestka", 8 => "meruňka", "broskev"); sort($ovoce); var_dump($ovoce); // 0 => 'broskev', 1 => 'hruška', 2 => 'jablko', 3 => 'meruňka', 4 => 'švestka' ?></pre></div><br> Funkci <code>sort</code> lze ve druhém parametru nastavit různé konstanty, které ovlivní způsob řazení. Například <code>SORT_FLAG_CASE</code> bude řadit bez ohledu na velikost písmen. Další jsou <a href="http://cz2.php.net/manual/en/function.sort.php">v manuálu</a>. <p>Kromě toho existuje celá rodina funkcí, které také řadí pole, ale jiným způsobem. Například <code>rsort</code> se používá stejně jako <code>sort</code>, ale řadí v opačném pořadí. Funkce <code>ksort</code> místo podle hodnot řadí podle klíčů (a samozřejmě neodstraní z pole původní klíče). Funkce <code>asort</code> řadí stejně jako <code>sort</code>, ale zachová původní klíče v poli. A pak existují ještě kombinace jako <code>krsort</code> (řadí podle klíčů v opačném pořadí), <code>arsort</code> (řadí podle hodnot v opačném pořadí a zachová původní klíče) a tak dále.<br> <h3 id="funkce-array-keys"><a href="#funkce-array-keys" class="zakotvit">↳</a> <span>array_keys</span></h3> <p>Funkce <a href="http://www.php.net/function.array_keys">array_keys</a> vrátí pole klíčů z předaného pole. Hodí se pokud máte asociativní pole a potřebujete seznam klíčů v něm. <p>Funkce má ještě další dva parametry, pomocí kterých je možné z pole vybrat jen klíče prvků s nějakou konkrétní hodnotou. Viz <a href="http://www.php.net/function.array_keys">manuál</a>. <p>Analogicky existuje také funkce <a href="http://www.php.net/function.array_values">array_values</a>, kterou by bylo možné použít, pokud se chcete zbavit původních klíčů pole a získat pole souvisle očíslované indexy od 0.<br> <h3 id="funkce-range-shuffle"><a href="#funkce-range-shuffle" class="zakotvit">↳</a> <span>funkce range a shuffle</span></h3> <p>Tyto funkce spolu nemají moc společného, ale jejich kombinace se dá šikovně využít.<br> Funkce <a href="http://www.php.net/function.range">range</a> má dva povinné parametry (začátek a konec) a jeden nepovinný (krok). Vrátí pole, které představuje řadu od hodnoty začátek do hodnoty konec v zadaném kroku (výchozí je 1). Funkce umí vyrobit řadu čísel nebo písmenek. <p>Příklad:<br> <div class="pre"><pre class="jush-php">$rada = range(1, 5); // Výsledek bude stejný jako: $rada = array(1, 2, 3, 4, 5);</pre></div><br> Funkce <a href="http://www.php.net/function.shuffle">shuffle</a> náhodně prohází prvky v poli. Nevrací nové pole, mění rovnou to předané. <p>Kombinaci <code>range</code> a <code>shuffle</code> lze použít v situaci, kdy je třeba získat několik náhodných čísel (nebo písmen) z určitého rozmezí tak, aby žádné jedno číslo nebylo vybrané vícekrát. <p>(Poznámka: Toto řešení se používá pro výběr více různých čísel, pokud je potřeba jen jedno náhodné číslo z určitého rozmezí, je lepší použít funkci <a href="http://www.php.net/function.rand">rand</a> nebo <a href="http://www.php.net/function.mt_rand">mt_rand</a>) <p>Příklad: Chceme vypsat tři navzájem různá náhodná čísla od 1 do 20.<br> <div class="pre"><pre class="jush-php">$rada = range(1, 20); // vytvoříme řadu shuffle($rada); // náhodně přeházíme // a vypíšeme první tři prvky echo $rada[0] . ", " . $rada[1] . ", " . $rada[2];</pre></div><h2 id="specialni-pole"><a href="#specialni-pole" class="zakotvit">↳</a> <span>Speciální předdefinovaná pole</span></h2> <p>PHP obsahuje několik speciálních proměnných typu pole, které jsou předdefinované, to znamená, že jsou ve skriptu dostupné automaticky, aniž byste je museli nějak plnit. <p>Všechny tyto proměnné byste měli používat pouze pro čtení; Pokud potřebujete některou položku nějak upravovat, zkopírujte si ji do jiné proměnné. <p>Předdefinovaná pole jsou:<br> • <b>$_SERVER</b>: Obsahuje různé běhové informace a informace o prostředí. Dá se odsud zjistit třeba jaký prohlížeč a z jaké IP adresy odeslal požadavek na stránku. Více informací v <a href="http://www.php.net/reserved.variables.server">manuálu</a>, nebo si zkuste vypsat obsah $_SERVER (poznámka: Ne každý server musí plnit všechny položky uvedené v manuálu a některé servery si mohou přidávat vlastní položky).<br> • <b>$_GET</b>: Obsahuje případná data odeslaná metodou GET (přes <code><form method="GET" action="…"></code>, nebo odkaz: <code>example.com/skript.php?nazev=hodnota</code>). Klíče v poli jsou názvy formulářových polí (uvedené v atributu <code>name</code> prvků), hodnoty jsou hodnoty polí. Více o odesílání hodnot na server si povíme později.<br> • <b>$_POST</b>: Analogické k $_GET, ale obsahuje data odeslaná metodou POST. Více o odesílání hodnot na server si povíme později.<br> • <b>$_COOKIE</b>: Obsahuje nastavené cookies (klíč je název cookie, hodnota je hodnota). Poznámka: Toto pole je pro čtení, cookies se nenastavují zápisem do něj! K tomu slouží funkce <a href="http://www.php.net/function.setcookie">setcookie</a>.<br> • <b>$_FILES</b>: Obsahuje informace o nahraných souborech (například z formuláře přes <code><input type="file"></code>)<br> • <b>$_SESSION</b>: Obsahuje data session (relace). Těm se věnuje článek v pokročilejší části.<br> • <b>$_REQUEST</b>: Tato proměnná obsahuje nějakou kombinaci $_GET, $_POST a $_COOKIE. Které z nich a s jakou prioritou (které pole „vyhraje“ v případě shody klíčů) závisí na nastavení PHP. Typické nastavení je buď $_GET a $_POST, nebo všechny tři.<br> • <b>$_ENV</b>: obsahuje proměnné prostředí, ve kterém PHP běží. <p>Nejčastěji se budeme setkávat s prvními čtyřmi uvedenými, hlavně $_GET a $_POST při odesílání formulářů (tomu se bude věnovat celá pozdější kapitola tohoto kurzu.)<br> <h2 id="vyzkousejte-si"><a href="#vyzkousejte-si" class="zakotvit">↳</a> <span>Vyzkoušejte si</span></h2> <p>1. Vytvořte si nějaké pole, vypište počet jeho prvků a poslední prvek. <p>2. Vytvořte si nějaké pole a pak ho vypište v HTML jako odrážkový seznam (<code><ul></code> / <code><li></code>) <p>3. Vypište, jaké všechny klíče obsahuje pole $_SERVER. Nechte si vypsat celé pole na svém serveru a podívejte se, jaké všechny hodnoty obsahuje. <p>4. Vytvořte skript, který vypíše obsah pole $_GET. Otevřete ho v prohlížeči a podívejte se, co vypíše. Pak zkuste v prohlížeči za adresu skriptu dopsat <code>?promenna=hodnota</code> a potvrdit. Podívejte se, co vypíše skript tentokrát.<br> <h2 id="vyzkousejte-si-reseni"><a href="#vyzkousejte-si-reseni" class="zakotvit">↳</a> <span>Řešení</span></h2> <p>1. Když pole bude v proměnné <code>$pole</code>, počet prvků je <code>count($pole);</code>, vypsání posledního prvku je <code>echo $pole[count($pole) - 1];</code> <p>2.<br> <div class="pre"><pre class="jush-php"><?php $pole = array("alfa", "beta", "gama"); $polozky = implode("<li>", $pole); echo "<ul><li>" . $polozky . "</ul>"; ?></pre></div><br> První <code><li></code> se musí vypsat v echo, protože implode před první položku oddělovat nevloží. Kdybychom chtěli mít v kódu i (nepovinné) ukončovací značky <code></li></code>, šlo by to přes <code>implode("</li><li>", $pole);</code> a v echo ještě místo <code>"</ul>"</code> dát <code>"</li></ul>"</code> <p>3. Výpis klíčů lze udělat například příkazem: <code>echo implode(", ", array_keys($_SERVER));</code><br> Výpis proměnné $_SERVER pak jednoduše přes <code>var_dump($_SERVER);</code> <p>4. Když použijete <code>var_dump($_GET);</code>, v prvním případě by pole mělo být prázdné a ve druhém by tam měla být položka s klíčem <code>promenna</code> a hodnotou <code>hodnota</code>. <p><span class="articleBox">Máte návrh na vylepšení či doplnění článku? Obsahuje článek nepřesné informace, nebo v něm chybí něco důležitého?<br> Tento článek má <a href="http://diskuse.jakpsatweb.cz/?action=vthread&forum=36&topic=146895">diskusní vlákno</a> na diskusi Jak Psát Web, kam můžete náměty a připomínky napsat.</span><br> </div> <div id="levy" class="col sidebar"> <a href="/" class="logo"><img src="/img/logo.png" title="logo"></a> <div id="navigace" class="menu"> <h2><span>Základní kurz</span></h2><ul><li><a href="/zakladni-kurz/1-uvod">Úvod</a><li><a href="/zakladni-kurz/2-co-je-potreba">Co je potřeba?</a><li><a href="/zakladni-kurz/3-nastaveni-editoru">Nastavení editoru</a><li><a href="/zakladni-kurz/4-zaklady-syntaxe">Základy syntaxe</a><li><a href="/zakladni-kurz/5-chyby">Hledání a oprava chyb</a><li><a href="/zakladni-kurz/6-promenne">Proměnné</a><li><a href="/zakladni-kurz/7-pretypovani">Přetypování</a><li><a href="/zakladni-kurz/8-operatory">Operátory</a><li><a href="/zakladni-kurz/9-pole">Pole</a><li><a href="/zakladni-kurz/10-podminky">Podmínky</a><li><a href="/zakladni-kurz/11-cykly">Cykly</a><li><a href="/zakladni-kurz/12-predani-dat">Předání dat na server</a><li><a href="/zakladni-kurz/13-funkce">Funkce</a><li><a href="/zakladni-kurz/14-rozsah-platnosti">Rozsah platnosti proměnných</a><br> </ul><h2><span>Programujeme v PHP</span></h2><ul><li><a href="/programujeme-v-php/soubory">Práce se soubory</a><li><a href="/programujeme-v-php/sessions">Sessions</a><br> </ul><h2><span>Správa webserveru</span></h2><ul><li><a href="/sprava-serveru/instalace">Instalace webserveru</a><li><a href="/sprava-serveru/cko">Často kladené otázky</a><br> </ul> </div> </div> <br style="clear:both"> <div id="paticka">Správcem webu Péhápko.cz je Joker, <a class="mail">mail zavináč it-joker tečka cz</a>. Informace o autorských právech a možnostech použití obsahu viz <a href="/autorska-prava">Autorská práva</a> <br><a href="/sign-in">Přihlášení</a> </div> </div> <script src="/js/netteForms.js"></script> <script src="/js/jush.js"></script> <script src="/js/main.js"></script> <script>jush.highlight_tag('pre'); main_init();</script> <script src="/js/ga.js"></script> </body>
HTML
Autoformát
Standardní režim
Mobilní zobrazení
CSS
Autoformát
CSS reset
Až na konci
J
ava
S
cript
Autoformát
jQuery
Umístění JS
window.onload
</head>
</body>