NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.

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 099, 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ý:

echo('<table border="1"><tr>');
for ($i = 0; $i < 100; $i++)
    echo('<td>' . htmlspecialchars($cisla[$i]) . '</td>');
echo('</tr></table>');

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:

echo('<table border="1"><tr>');
foreach($cisla as $cislo)
    echo('<td>' . htmlspecialchars($cislo) . '</td>');
echo('</tr></table>');

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_intersec­t_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:

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

Výstup:

Tvoje stránka
localhost

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:

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

Výsledek:

Tvoje stránka
localhost

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

 

Předchozí článek
Řešené úlohy k 7.-11. lekci PHP
Všechny články v sekci
Základní konstrukce jazyka PHP
Přeskočit článek
(nedoporučujeme)
Kvíz - Skládání, pole a cykly v PHP
Článek pro vás napsal David Hartinger
Avatar
Uživatelské hodnocení:
217 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity