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 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 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ý:
{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 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_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ší 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:
{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í 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:
{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 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