NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 13 - Práce s polem pomocí cyklů v PHP

V předešlém cvičení, Řešené úlohy k 8.-12. 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 stokrát opakovat, počet opakování tedy známe, a proto zvolíme for cyklus. Řídicí proměnná for cyklu ($i) bude nabývat hodnot 099, jelikož víme, že pole o 100 položkách má indexy 099. 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 sto čí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 se však 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 ke čtení nebo k 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 např. chceme 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 v tabulce 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 tím ušetříme práci, jednak se vyvarujeme chyb, které bychom mohli udělat. Vestavěné PHP funkce jsou ale hlavně programované v céčku, a jsou tedy z hlediska výkonu úplně na jiné úrovni.

Funkce nyní nemusíte podrobně zkoumat, pouze si přečtěte, co která dělá. 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ší po největší.

Pole polí

Pokud jste přemýšleli, zda mohou být položky pole samy polem, ano, je to možné. Pole je datový typ jako každý jiný, a můžeme do něj tudíž vložit i několik polí. Velmi často budeme 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 tři pole, která 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 nám vrátí nějaký databázový dotaz pro výběr uživatelů, pouze jméno a příjmení by byly pravděpodobně zvlášť. Vypsat takovéto pole byste 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í dvou 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 lze takovéto 2D pole použít 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 576x (1.88 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP

 

Předchozí článek
Řešené úlohy k 8.-12. 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í:
233 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