Opakování

Další úkol, kterým nám počítač může nabídnout, je opakování úkolů stále dokola, pokud neřekneme jinak. Abychom však toto opakování snadněji pochopili, představíme si další typ proměnné. Dosud jsme poznali řetězec (string), číslo (int), desetinné číslo (float) a v minulé lekci jsme si mohli všimnout pravdivostních hodnot (boolean) – true a flase. Novým typem proměnné je pole (array).

Pole je skupinou více proměnných. V posledních verzích PHP se inicializuje (vytváří) pomocí hranatých závorek [ a ], ve kterých jsou jednotlivé elementy oddělené čárkou.

<?php
$prazdnePole = []; // Toto je prázdné pole

$barvy = ['červená', 'modrá', 'bílá']; // Toto pole obsahuje 3 řetězce

$znamky = [1, 1.5, 4, 3.5, 2, 1]; // Toto pole obsahuje 4 celá čísla a 2 desetinná čísla

$polePoli = [$prazdnePole, $barvy, $znamky]; // Toto pole obsahuje 3 jiná pole.

Pokud chceme vypsat konkrétní element pole, musíme přidat k názvu proměnné také index (číslo, kolikátý element v poli to je). Zde je však jedna záludnost, nepočítá se totiž od 1, ale od 0. Takže první element má odkaz [0].

Zde je výpis některých elementů z předchozího případu:

<?php

echo $barvy[1]; // modrá

echo $znamky[3]; // 3.5

echo $polePoli[2][0]; // červená

Tohoto indexování leze využít i při přidávání nových prvků:

<?php
$barvy = ['červená', 'modrá', 'bílá'];
$barvy[3] = 'zelená';
$barvy[] = 'oranžová; // tento zápis přidá elementu automaticky nový index

Existuje mnoho funkcí, které s poli pracují, ale pro nás asi nejdůležitější nyní bude funkce na zjištění počtu prvků – count($pole).

Pro výpis pole při zkoušení nemůžeme používat klasické „echo“, ale můžeme použít print_r($pole) nebo var_dump($pole). Tyto funkce nám krásně ukážou obsah $pole.

Nyní si ukážeme, jak vytvořit blok opakujících se instrukcí.

While a do while

První funkcí, kterou si představíme, je funkce while a její analogie do while. Parametr této funkce (to, co je v kulaté závorce) je podmínka, která se musí splnit, aby se mohlo pokročit dál dovnitř funkce.

<?php
// funkce while
$i = 1;
while($i < 11) { // Opakuj dokud $i je menší než 11
    echo $i;
    $i++; // $i se navýší o 1
}
echo $i; // 11

// funkce do while
$i = 0;
do {
    echo $i;
    $i++; // $i se navýší o 1
} while($i < 11);
echo $i; // 11

Jaký je tedy mezi těmito funkcemi rozdíl? Při troše představivosti sami uvidíme, že hlavní rozdíl se objevuje při prvním běhu cyklu. Zatímco while se spustí temprve, byla-li splněna podmínka, do while se spustí vždy alespoň jednou.

For cyklus

Další hojně používanou funkcí je for cyklus. Zde je příklad předchozí funkcionality za použití for cyklu.

<?php
for ($i = 1; $i < 11; $i++) {
    echo $i;
}

echo $i; // 11

Nyní si rozebereme celý parametr funkce. Je rozdělen na 3 části. V první definujeme základní čítací index (můžeme použít již existující proměnnou, nebo jako v našem případě jsme ji definovali přímo ve funkci). Ve druhém dáváme dohromady podmínku, která se musí splnit, aby proběhl blok kódu uvnitř složených závorek. Ve třetím je čítací funkce, která proběhne po každém proběhlém cyklu (v našem případě se $i navýší o 1).

Foreach

Poslední z cyklických funkcí si představíme foreach. Tato funkce se používá především u polí, protože, jak název napoví, funkce běží tolikrát, kolik je elementů v poli. Jako parametr tedy vložíme pole, které je následované klíčovým slovem as a názvem nově vzniklé proměnné, kterou chceme používat. Pokud chceme vypisovat i aktuální indexy, pak místo názvu proměnné přidáme zápis klíč (index) => proměnná (hodnota indexu).

V následujícím příkladu si ukážeme něco praktického. Vytvoření html tabulky pro rozvrh hodin. Použijeme zde nejen foreach, ale i forcyklus.

<?php
$dnyVTydnu = ['Po', 'Út', 'St', 'Čt', 'Pá'];
$pocetHodin = 5;

echo '<table border="1px">';
echo '<tr><td width="100px"></td>;

for($i = 1; $i <= $pocetHodin; $i++) {
    echo '<td width="150px">'.$i.'</td>';
}

echo '</tr>';

foreach ($dnyVTydnu as $den) {
    echo '<tr>';
    echo '<td>'.$den.'</td>';
    for($i = 1; $i <= $pocetHodin; $i++) {
        echo '<td width="150px">'.$i.'</td>';
    }
    echo '<tr>';
}

echo '</table>';

Výsledek by měl vypadat takto: