Lekce 12 - Práce s polem pomocí cyklů v PHP
V předešlém cvičení, Řešené úlohy k 7.-11. lekci PHP, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
V dnešním PHP tutoriálu se podíváme na cyklus foreach a ukážeme si, jak lze cykly využít při práci s polem.
Naplnění pole cyklem
Právě cykly se často používají pro automatizovanou práci s poli.
Položek je v poli mnoho a pracovat s nimi po jedné by určitě nebyl
nejlepší nápad. Začněme naplněním pole čísly od 1
do
100
.
Chceme něco 100x opakovat, počet opakování tedy víme a proto zvolíme
for
cyklus. Řídící proměnná for cyklu ($i
) bude
nabývat hodnot 0
až 99
, jelikož víme, že pole o
100 položkách má indexy 0
- 99
. Protože chceme
hodnoty v položkách od 1
do 99
, musíme k indexu
přičíst jedničku:
$cisla = array(); for ($i = 0; $i < 100; $i++) $cisla[$i] = $i + 1;
Výpis pole cyklem
Nyní máme v poli uložených 100 čísel. Podobné generování pole se obvykle v praxi moc nepoužívá, jelikož hodnoty v něm získáme např. z databáze. S něčím ale pracovat musíme Co už se používá velmi často je výpis hodnot z pole, např. do tabulky.
Cyklus for
Určitě byste dali dohromady následující kód, který by patřil za kód výše uvedený:
{PHP}
$cisla = array();
for ($i = 0; $i < 100; $i++)
$cisla[$i] = $i + 1;
echo('<table border="1"><tr>');
for ($i = 0; $i < 100; $i++)
echo('<td>' . htmlspecialchars($cisla[$i]) . '</td>');
echo('</tr></table>');
{/PHP}
Kód vypíše pomocí cyklu for
obsah pole do tabulky. V poli by
v praxi nebyla jen vygenerovaná čísla, ale jednalo by se např. o komentáře
z databáze. K těm se brzy dostaneme.
Cyklus foreach
K výpisu pole se však mnohem více hodí zjednodušená verze cyklu
for
, kterou je foreach
. Zapisujeme ho takto:
foreach ($kolekce as $prvek)
Cyklus foreach
proiteruje všechny položky v poli a v
proměnné cyklu vždy vrací aktuální položku. To je rozdíl oproti cyklu
for
, který v proměnné cyklu vrací index aktuální
položky.
Výpis obsahu našeho pole do tabulky bychom pomocí cyklu
foreach
napsali takto:
{PHP}
$cisla = array();
for ($i = 0; $i < 100; $i++)
$cisla[$i] = $i + 1;
echo('<table border="1"><tr>');
foreach($cisla as $cislo)
echo('<td>' . htmlspecialchars($cislo) . '</td>');
echo('</tr></table>');
{/PHP}
Výstup programu bude identický. Cyklus foreach
slouží
zejména pro čtení nebo pro práci s objekty (ty zatím ještě neznáme), kde
je přehlednější, než cyklus for
.
Proměnná cyklu obsahuje v příkladu výše kopii prvku na aktuální
pozici pole. Pokud bychom se pokusili v cyklu proměnnou $cislo
modifikovat, nemělo by to na pole žádný vliv, jelikož bychom změnili pouze
kopii daného prvku a ne prvek samotný. Pokud bychom chtěli např. všechny
prvky v poli vynásobit dvěma, musíme použít cyklus for
:
for ($i = 0; $i < 100; $i++) $cisla[$i] = $cisla[$i] * 2;
Často ale chceme např. jen dvojnásobky vypsat, nikoli měnit původní
pole. K tomu by nám cyklus foreach
stačil.
PHP funkce pro práci s polem
PHP pro práci s poli nabízí spoustu hotových funkcí. Nebudeme je popisovat nijak podrobně, pouze si uvedeme seznam těch nejdůležitějších. Každá funkce odkazuje na český PHP manuál, kde je popsaná včetně příkladu. Vždy, než začneme v PHP něco programovat, je dobré se podívat, zda k tomu již nemáme k dispozici nějakou funkci. Jednak si ušetříme práci, vyvarujeme se chybám, které bychom mohli udělat a hlavně vestavěné PHP funkce jsou programované v céčku a jsou tedy z hlediska výkonu úplně někde jinde.
Určitě nemusíte funkce teď zkoumat, jen si přečtěte, co která dělá a když to budete v budoucnu potřebovat, vyhledáte si ji.
array_fill | Naplní pole hodnotami. |
array_flip | Otočí klíče a hodnoty v poli. |
array_intersect_key | Vrátí pole, jehož klíče jsou průnikem klíčů dvou polí. |
array_intersect | Vrátí pole, které je průnikem hodnot zadaných polí. |
array_keys | Vrátí pole klíčů ze zadaného pole. |
array_map | Aplikuje callback (funkci) na všechny prvky v poli. |
array_merge | Spojí několik polí do jednoho. |
array_pop | Umožňuje používat pole jako zásobník, odebere poslední prvek. |
array_push | Umožňuje používat pole jako zásobník, vloží prvek za poslední prvek. |
array_reverse | Převrátí hodnoty v poli. |
array_search | Vyhledá v poli daný prvek. |
array_shift | Umožňuje používat pole jako frontu, odebere první prvek. |
array_sum | Vrátí součet hodnot v poli. |
array_unique | Odstraní duplicitní hodnoty v poli. |
array_unshift | Umožňuje pole používat jako frontu, přidá první prvek. |
array_values | Vrátí pole všech hodnot z daného pole. |
count | Spočítá prvky v poli, případně v objektu. |
extract | Rozbalí proměnné z pole do současného scope. |
ksort | Seřadí pole podle klíčů. |
sort | Seřadí hodnoty v poli od nejmenších po největší. |
Pole polí
Pokud vás napadlo, zda mohou být položky pole samy polem, tak to jde. Pole je datový typ jako každý jiný a do pole můžeme vložit i několik polí. Velmi často budete pracovat s polem, jako je toto:
$pavel = array( 'jmeno' => 'Pavel Novák', 'vek' => '20', ); $tomas = array( 'jmeno' => 'Tomáš Marný', 'vek' => '50', ); $jana = array( 'jmeno' => 'Jana Nová', 'vek' => '35', ); $lide = array($pavel, $tomas, $jana);
Vytvoříme si 3 pole a tato pole vložíme do jednoho pole jako jeho hodnoty. Vnitřní pole představují jednotlivé lidi, vnější je obaluje, abychom s nimi mohli jednoduše hromadně pracovat a třeba je vypsat.
Přesně takovéto pole vám vrátí nějaký databázový dotaz pro výběr uživatelů, jen by asi bylo jméno a příjmení zvlášť. Vypsat byste ho už měli umět, pro jistotu si to uveďme:
{PHP}
$pavel = array(
'jmeno' => 'Pavel Novák',
'vek' => '20',
);
$tomas = array(
'jmeno' => 'Tomáš Marný',
'vek' => '50',
);
$jana = array(
'jmeno' => 'Jana Nová',
'vek' => '35',
);
$lide = array($pavel, $tomas, $jana);
echo('<table border="1">');
echo('<tr><th>Jméno</th><th>Věk</th></tr>');
foreach ($lide as $clovek) {
echo('<tr><td>' . htmlspecialchars($clovek['jmeno']) . '</td>');
echo('<td>' . htmlspecialchars($clovek['vek']) . '</td></tr>');
}
echo('</table>');
{/PHP}
Výstup:
O takovýchto polích se často mluví jako o vícerozměrných. A to zejména tehdy, když se jedná např. o pole čísel. Takové pole si potom můžeme představit jako tabulku (matici). Pole 3×3 bychom mohli vytvořit např. takto:
$matice = array( array(1, 2, 3), array(4, 5, 6), array(7, 8, 9) );
Větší pole bychom samozřejmě vytvářeli cyklem. Vypisovat a pracovat s
polem budeme pomocí 2 vnořených cyklů for
, jako jsme to dělali
u malé násobilky. Ukažme si jak by vypadal výpis pole výše:
{PHP}
$matice = array(
array(1, 2, 3),
array(4, 5, 6),
array(7, 8, 9)
);
echo('<table border="1">');
for ($j = 0; $j < 3; $j++) {
echo('<tr>');
for ($i = 0; $i < 3; $i++) {
echo ('<td>' . $matice[$j][$i] . '</td>');
}
echo('</tr>');
}
echo('</table>');
{/PHP}
Výsledek:
Prakticky jsem takovéto 2D pole použil např. v online řešiči sudoku. Dnešní příklady jsou jako vždy ke stažení níže.
V následujícím kvízu, Kvíz - Skládání, pole a cykly v PHP, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 565x (1.88 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP