Pole - Český PHP manuál
V tomto článku si vysvětlíme, k čemu pole slouží a jak s polem v PHP pracovat různými způsoby.
Pole
Pole je datový typ a obecně slouží k uložení více hodnot stejného typu, které spolu nějak logicky souvisí. Pomocí pole můžeme mít v proměnné např. obsah 30ti textových polí, aniž bychom museli zakládat proměnné $text1, $text2, $text3... až $text30. Založíme pouze jedno pole. To si můžeme představit jako přihrádky v paměti, kde je v každé přihrádce jeden prvek pole. Pole založíme pomocí klíčového slova array:
<?php $pole = array();
Od PHP 5.4 a vyšší postačí pouze:
<?php $pole = [];
V proměnné $pole je nyní prázdné pole. Založit můžeme samozřejmě pole již s nějakými hodnotami, jednoduše je zapíšeme do závorky a oddělíme čárkami:
<?php $barvy = array('červená', 'zelená', 'žlutá', 'fialová');
K prvkům pole přistupujeme přes hranatou závorku (tzv. indexer). Takto založené pole je tzv. číselně indexované. Prvky jsou číslovány od nuly a přistupujeme k nim pomocí indexů:
<?php $barvy = array('červená', 'zelená', 'žlutá', 'fialová'); echo $barvy[2];
Výstup:
žlutá
PHP je interpretovaný jazyk a proto si může dovolit poskytnou programátorovi vysoký komfort. Pro začátek si řekněme, že pole v PHP jsou "nafukovací". Nemají pevnou velikost, můžeme do nich prvky libovolně přidávat:
<?php $barvy = Array('červená', 'zelená', 'žlutá', 'fialová'); $barvy[] = 'bílá';
Prázdné závorky odkazují na další index do pole, který v něm ještě není. Takto do něj můžeme zapsat další prvek. [] ukazuje vždy na index o jednu větší než všechny indexy v poli:
<?php $barvy[6] = 'modrá'; $barvy[4] = 'zelená'; $barvy[] = 'žlutá'; print_r($barvy);
Výstup:
Array ( [6] => modrá [4] => zelená [7] => žlutá )
Také víme, že PHP neexistující proměnnou po přiřazení založí. Pole tedy nemusíme ani deklarovat (i když to není nejvhodnější nápad) a stačí prvky uložit:
<?php $barvy[0] = 'červená'; $barvy[1] = 'zelená'; $barvy[2] = 'žlutá'; $barvy[3] = 'fialová';
Indexy si nyní musíme hlídat manuálně. Pole si můžeme vypsat pomocí funkce print_r($barvy), vypadá takto:
Array ( [0] => červená [1] => zelená [2] => žlutá [3] => fialová )
Iterace prvky pole
Asi bychom všichni uměli prvky v poli vypsat (nebo nějak zpracovat). Možná by nás napadl podobný postup:
<?php $barvy = array('červená', 'zelená', 'žlutá', 'fialová'); echo $barvy[0] . ' ' . $barvy[1] . ' ' . $barvy[2] . ' ' . $barvy[3];
Toto jistě není nejchytřejší způsob, co kdyby pole mělo tisíc prvků? Použijeme foreach cyklus, který projede všechny prvky pole:
<?php $barvy = Array('červená', 'zelená', 'žlutá', 'fialová'); foreach ($barvy as $barva) { echo $barva . ' '; }
Výstup:
červená zelená žlutá fialová
Do pole si můžeme samozřejmě ukládat cokoli, může jít o textové řetězce, čísla i objekty.
Reference
Je nutné zmínit, že celá pole a i prvky pole v foreach cyklu se předávají jako kopie, nikoli referencí. To může být nezvyklé a také to může zapříčinit problémy se změnou jejich hodnoty, pokud je předáváme v parametru funkce nebo s nimi pracujeme v cyklu. Tento kód nebude fungovat:
<?php // Tento kód nebude fungovat $pole = array(1, 2, 3); foreach ($pole as $prvek) { $prvek = 1; } print_r($pole);
Ačkoli to může vypadat, že jsme nastavili všechny prvky pole na samé jedničky, pole se vůbec nezměnilo. Prvek, do kterého jsme přiřazovali, byl totiž pouhou kopií prvku z pole. Referenci na prvek (nebo pole) si vynutíme pomocí znaku '&':
<?php $pole = array(1, 2, 3); foreach ($pole as &$prvek) { $prvek = 1; } print_r($pole);
Nyní vše funguje tak, jak má. Obdobná situace by nastala při předání pole funkci:
<?php function zmenPole($pole) { $pole[0] = 3; } $pole = Array(1, 2, 3); zmenPole($pole); print_r($pole);
Opět se nic nezmění, celé pole se před předáním funkci zkopíruje a změníme pouze jeho kopii, která se poté zahodí. Vyřešit to můžeme buď tím, že vrátíme kopii pole z funkce a tou zas nahradíme naše původní pole. Nebo můžeme použít referenci (to mi přijde vzhledem ke konvencím z dalších programovacích jazyků logičtější):
<?php function zmenPole(&$pole) { $pole[0] = 3; } $pole = Array(1, 2, 3); zmenPole($pole); print_r($pole);
Typy prvků
Další specialitou dynamického PHP je to, že každý prvek v poli může být jiného typu a některé prvky (indexy) v poli být dokonce ani nemusí:
<?php $pole[2] = "Text"; $pole[3] = 12; $pole[8] = Array("Vnořené pole", 8); print_r($pole);
Výstup:
Array ( [2] => Text [3] => 12 [8] => Array ( [0] => Vnořené pole [1] => 8 ) )
O dalším využití pole pojednává článek asociativní a vícerozměrná pole.