12. díl - Práce s polem pomocí cyklů v PHP

PHP Základní konstrukce Práce s polem pomocí cyklů v PHP American English version English version

V minulém dílu seriálu tutoriálů se základy PHP jsme se naučili cykly for a while. V ndešním dílu cykly dokončíme a ukážeme si, jak je lze 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říčí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)

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í 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ý. 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 aktuaá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 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 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íču 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ýpis pole lidí v PHP

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 3x3 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 for cyklů, 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:

2D pole jako matice v PHP

Prakticky jsem takovéto 2D pole použil např. v online řešiči sudoku. Příště dokončíme úplné základy PHP, uvedeme si funkce pro práci s textovými řetězci a naučíme se deklarovat vlastní funkce. Dnešní příklady jsou jako vždy ke stažení níže.


 

Stáhnout

Staženo 339x (1.53 kB)
Aplikace je včetně zdrojových kódů v jazyce php

 

  Aktivity (3)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (12 hlasů) :
55555


 


Miniatura
Předchozí článek
Cvičení k 7.-11. lekci PHP
Miniatura
Všechny články v sekci
Základní konstrukce jazyka PHP
Miniatura
Následující článek
Cvičení k 12. lekci PHP

 

 

Komentáře

Avatar
Libor Šimo (libcosenior):

V závere článku je napísané:
"Příště dokončíme úplné základy PHP, uvedeme si funkce pro práci s textovými řetězci a naučíme se deklarovat vlastní funkce."

Plánuje sa to?

Odpovědět 11.10.2013 7:59
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Čápka:

Kdyby se to neplánovalo, tak to tam není napsané.

Odpovědět 11.10.2013 8:30
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Libor Šimo (libcosenior):

Sorry za blbú otázku, ale nevšimol som si, že komentáre ostatných sú tiež z dnešného dátumu a myslel som si totiž, že článok bol napísaný už dávnejšie. Škoda, že pri článkoch nie je uvedený dátum vystavenia.
Keby boli, určite by som ten dotaz nenapísal.

Odpovědět  +3 11.10.2013 11:23
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Čápka:

Plánuji přidat data poslední revize, data přidání sem dávat nechci.

Odpovědět  +2 11.10.2013 11:31
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
studnicka.ji
Člen
Avatar
studnicka.ji:

hele je zde jedna malá chybka cituji: "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říčíst jedničku"

hodnoty budou od 1 do 100 jenom aby to někoho nemátlo

 
Odpovědět  +1 1.8.2014 10:58
Avatar
MArtin
Člen
Avatar
MArtin:

Len taka zaujimavost:
foreach() v PHP3 nebol, tak sa to robilo takto:

while(list($key, $value) = each($array)){
        //...
}

a to este trebalo pred to davat

reset($array);
 
Odpovědět 30.10.2015 14:36
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.