Lekce 5: Pole
- Věřte, že samotné proměnné vám za chvíli stačit nebudou a budete chtít hodnoty někam ukládat. Máme tu 3 možnosti.
První možností jsou pole, o kterých je tato lekce, potom soubory a databáze.
- Možnosti 2 a 3 si projdem taky, ale to až jindy.
Vysvětlení úkolu 4 z lekce 4 a typu array
- V předešlé lekci ve 4. úkolu jsme už lehce nakousli pole. Jak jsem už říkal, tak PHP si samo určuje o jaký typ se jedná a tím typem může být i pole,
čili array.
$jmeno = "Franta";
echo $jmeno; // vypise nam cely string "Franta"
// vezme promennou $jmeno jako pole a vypise nam pismeno na 0. pozici
echo $jmeno[0]; // F
// tento jednoduchy cyklus vypise jednotlive pismena v promenne tak,
// jako kdyby to bylo pole
for ($i = 0; $i < strlen($jmeno); $i++) echo $jmeno[$i]; // Franta
- Jednou jsem také zmínil u přetypování typ
array, ale nijak jsem ho nevysvětlil a právě teď je vhodný čas.
- Jak jistě už víme, tak typ
array značí pole, takže pokud proměnnou přetypujem na tyto typ, tak vznikne nové pole.
$jmeno = "Lucka"; // typ string s hodnotou "Lucka"
$jmeno = (array) $jmeno; // ze stringu se stane pole
echo $jmeno[0]; // pokud chci vypsat Lucku, tak musim pouzit index v poli
$jmeno[] = "Petra"; // nyni muzu do existujiciho pole pridat dalsi osobu
echo $jmeno[1]; // vypisu "Petra"
- Pokud tomu ještě moc nerozumíte, tak nevadí. Čtěte dál a tam to rozeberu trochu podrobněji.
Tvorba polí
- Jak vytvořit pole? K tomu nám slouží klíčové slovo array. Ale než začneme, tak se naučíme další příkaz count,
a sizeof, který slouží podobně jako strlen, jen s tím rozdílem, že zjišťují velikost pole (počet prvků).
$pole = array(1,2,3,4,5); // vytvorime promennou $pole o 5 hodnotach
$velikost = count($pole); // zjisti pocet prvku pole = 5
$velikost = sizeof($pole); // tez zjisti velikost pole = 5
// vypiseme obsah pole
// vypis: 12345
for ($i = 0; $i < $velikost; $i++) echo $pole[$i];
- Lze také vytvořit pole bez použití klíčového slova
array a to tak, že za název proměnné dáme
[]. Tím docílíme toho,
že typ proměnné se nastaví na jednorozměrné pole.
$arr[] = "Ahoj"; // v poli na pozici 0 bude slovo "Ahoj"
Pozor: Pokud chceme do pole přidat další hodnotu, tak
NEpoužijeme operátor
.=, ale jen
=.
$arr[] = "Světe"; // v poli na pozici 1 bude slovo "Světe"
- Naše pole
$arr má tedy 2 hodnoty. Může se někdy stát, že budete potřebovat vypsat nějaký znak z nějaké hodnoty v poli,
ale jak vidíte, tak pole není typu string, ale to nevadí, je to úplně ten samí postup. Opět dodáme v jaké hodnotě a jaký index se má vypsat.
echo $arr[0][0]; // vypisem z hodnoty "Ahoj" znak na 0. pozici -> "A"
echo $arr[1][2]; // vypisem z hodnoty "Světe" znak na 2. pozici -> "ě"
Poznámka: Pole vždy začíná od indexu 0, takže znak na pozici 2 je ve skutečnosti až 3.
- Jak můžete vidět, tak se dostáváme k vícerozměrným polím.
Vícerozměrné pole je to samé, jen obsahuje pole polí.
- Deklarace pole vypadá stejně.
$foo = array(); // deklarace prazdneho pole (neresi velikost pole, jen typ)
// vytvori nam prvni pole, ktere bude mit 2 hodnoty a ty hodnoty budou dalsi pole
// a kazde "vnorene" pole bude mit 3 hodnoty
$foo = array
(
array(1,2,3.5),
array(4,5,"text")
);
Poznámka: Deklarace prázdného pole není nutná, protože typ se zjistí automatick při prvním použitím proměnný.
- Už to začíná být zajímavé že? Jak se teď ale k hodnotám dostat? Možností je více, ale ukážem si zatím 2.
// prvni metoda je lehka, pres index
echo $foo[0][1]; // vypise 2
echo $foo[1][2]; // vypise "text"
// pokud by jsme chteli vypsat nejaky znak z "text"
// tak opet pridame dalsi pole, kde jsou ulozeny jednotlive znaky
echo $foo[1][2][2]; // vypise "x" ze slova "text"
// druha metoda je pres 2 cykly, kde prvni cyklus projizdi pole poli a
// druhy prochazi jednotlive pole
for ($i = 0; $i < count($foo); $i++)
{
// zde musime zjistit velikost vnitrniho pole uvnitr pole
for ($j = 0; $j < count($foo[$i]); $j++)
{
echo $foo[$i][$j]; // vypise: 123.545text
}
}
- Na tomto principu jsou založené matice. Samozřejmě nemusíme tvořit pouze dvojrozměrné pole, lze i víc, ale to už moc nedoporučuji.
Maximální je právě dvojrozměrné, možná ještě tří, ale pokud máte víc, tak veřte, že váš způsob je špatný způsob.
- Dejme si příklad, že máme pole polí v poli a každé to pole má řekněme 30 hodnot. Takže celý cyklus se bude procházet 30*30*30 = 27000!
a to už na načítání stránky je lehce poznat a to přece nechceme.
Dodatek
- Pole můžeme rovněž použít jako klasickou proměnnou. Ta má výhodu v tom, že název proměnné je stejný, jen se mění název pole,
kde je uložená výsledná hodnota.
- Výborné využití to má například v proměnných, u kterých víme, že patří k nějakému jistému účelu. Vypůjčím si příklad z databází,
kde se toto často používá.
$db["server"] = "localhost";
$db["jmeno"] = "root";
$db["heslo"] = "heslo";
- Z toho vznikne jedno pole, které bude mit místo indexů specifické názvy a hodnoty. Takže pokud budeme chtít vypsat nějakou hodnotu z pole,
tak zavolámě proměnnou přesně tak, jak jsme ji nastavili.
echo $db["jmeno"]; // vypise "root"
- Tohle má jen jednu nevýhodu a to tu, že na takové pole nelze použít cyklus
for, protože ten očekává právě čísla jako index.
- Na takové pole se používá příkaz
foreach, ale o tom později.
- Další užitečný příkaz, který budeme potřebovat, je na vygenerování náhodného čísla a to přes
rand(). Syntaxe je jednoduchá, skládá se ze 2 parametrů,
kde první označuje od jakého čísla a druhý po jaké číslo.
$gen = rand(1, 9); // vygeneruje cislo od 1 do 9
Dobrovolný domácí úkol
1) Vytvořte matici o velikosti 4x4 a naplňte jí čísly v rozmezí 10 až 99 a vypište tak, aby měla hezký formát matice.
// tento cyklus si bere radky
for ($i = 0; $i < 4; $i++)
{
// tady se projizdeji sloupce
for ($j = 0; $j < 4; $j++)
{
// do promenne ukladam nahodna cisla
// nebojte, nezapomel jsem na $j, to se doplni automaticky podle posledniho cyklu
$matice[$i][] = rand(10, 99);
echo $matice[$i][$j]." "; // hned vypisu
}
echo "
"; // a odradkuju
}
2) Opět vytvořte matici o velikosti 8x8, kde se budou generovat pouze sudá čísla v rozmezi 2 až 8.
Potom sečtěte všechna čísla v matici a vypište výsledek.
$soucet = 0; // nadeklarujeme si promennou s vychozi hodnotou 0
for ($i = 0; $i < 8; $i++)
{
for ($j = 0; $j < 8; $j++)
{
// pomocny cyklus pro zjisteni, jestli je vygenerovane cislo sude
do
{
$gen = rand(2, 8);
}
while ($gen % 2);
$matice[$i][] = $gen; // vlozi $gen (sude cislo) do matice
$soucet += $gen; // scita jednotliva cisla v matici
}
}
echo $soucet;