Lekce 12 - 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

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Cykly for a while v PHP, jsme se naučili cykly for a while. V dnešním PHP tutoriá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>');

Your page
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 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:

Your page
localhost

Prakticky jsem takovéto 2D pole použil např. v online řešiči sudoku. V příští lekci, Funkce pro práci s řetězci v PHP, 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 397x (1.53 kB)
Aplikace je včetně zdrojových kódů v jazyce php

 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
21 hlasů
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 sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Miniatura
Předchozí článek
Cykly for a while v 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
Aktivity (9)

 

 

Komentáře
Zobrazit starší komentáře (8)

Avatar
Nocik
Člen
Avatar
Nocik:2.12.2017 18:17

Prosím.. proč je v posledním příkladu na řádku

echo('<td>' . $matice[$j][$i] . '</td>');

proměnná matice s indexy $j a $i? mohl by mi to někdo vysvětlit?

Editováno 2.12.2017 18:20
Odpovědět 2.12.2017 18:17
Vítězství je stav mysli.
Avatar
Peter Sciranka
Redaktor
Avatar
Odpovídá na Nocik
Peter Sciranka:2.12.2017 19:33

Ahoj, jedná sa totiž o tzv. 2D pole, to znamená, že pole obsahuje ďalšie polia. V tomto príklade máme pole $matice a dané pole obsahuje ďalšie polia. Teda $matice[0] (nultá pozícia daného poľa) neobsahuje text, číslo,.. ale pole. A ak sa chceš dostať k položke tohto poľa, musíš najprv určiť napr. že chcem z poľa $matice z 0 pozície vybrať hodnotu, ktorá je na pozícii jedna, tak toto zapíšeš ako $matice[0][1]. Teda ak by si napísal $matice[0], tak by si dostal pole, ktoré je na tejto pozícii umiestnené, ale ty nechceš celé pole, ale konkrétny prvok daného poľa.

Dúfam, že som ťa nedoplietol ešte viac :)

Odpovědět  +1 2.12.2017 19:33
Act as if it was Impossible to Fail
Avatar
Nocik
Člen
Avatar
Odpovídá na Peter Sciranka
Nocik:2.12.2017 19:44

Po prvních 2 řádcích jsem kroutil hlavou :D ale jakmile jsem přečetl 2x tak sem pochopil, děkuji ;)

Editováno 2.12.2017 19:44
Odpovědět  +1 2.12.2017 19:44
Vítězství je stav mysli.
Avatar
František Kreisinger:12. března 16:08

Chtěl bych k naplnění pole hodnotami využít cyklus FOREACH. Ten však předpokládá, že pole je již vytvořené. PHP však nemá deklaraci pole. Jakým nejjednodušším způsobem lze vytvořit větší vícerozměrné prázdné pole případně i asociativní?

Odpovědět 12. března 16:08
Začátečník v PHP, HTML i webovém programování vůbec.
Avatar
František Kreisinger:13. března 8:20

Jak se dá zjistit počet dimenzí pole (kolika rozměrné je)?

Odpovědět 13. března 8:20
Začátečník v PHP, HTML i webovém programování vůbec.
Avatar
dez1nd
Člen
Avatar
Odpovídá na František Kreisinger
dez1nd:13. března 13:19

Na to asi funkce není.
Musíš si to spočítat sám.
Vyuzijes na to cykly foreach a podmínky.

Editováno 13. března 13:21
 
Odpovědět 13. března 13:19
Avatar
Odpovídá na dez1nd
František Kreisinger:19. března 11:04

Tak jsem si funkci na zjištění počtu dimenzí pole nakonec napsal jako rekurzivní, i když jsem měl problémy pochopit, jak to funguje. Pokud jde o jednoduché rychlé vytvoření pole, tak na to jsou asi nejvhodnější funkce array_fill, range či array_fill_key.

Odpovědět 19. března 11:04
Začátečník v PHP, HTML i webovém programování vůbec.
Avatar
dez1nd
Člen
Avatar
Odpovídá na František Kreisinger
dez1nd:19. března 12:22

řekl bych, že rychlejší je napsat

$myArray[1][1][1][1] = "1a";
 
Odpovědět 19. března 12:22
Avatar
dez1nd
Člen
Avatar
Odpovídá na dez1nd
dez1nd:19. března 12:45

jé to je ale blbost co jsem napsal :)

 
Odpovědět 19. března 12:45
Avatar
Jiří Románek:13. května 20:14

ahoj, mám neprogramovací problém. Nelze mi označit lekci jako absolvovanou, i když klikám i desetkrát, aktualizuji apod. Je pro to třeba udělat něco speciálního, než jen kliknout na tlačítko "označit lekci jako absolvovanou"? Ne že by to byl nějaký zásadní problém, ale je to takové motivační :) Díky!

 
Odpovědět 13. května 20:14
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 10 zpráv z 18. Zobrazit vše