Polia

V tejto kapitole si preberieme asi najdôležitejší typ premennej pri programovaní. Schválne sme si ho nevysvetľovali na začiatku sekcie jazyka PHP ako ostatné typy, pretože je troška zložitejší na pochopenie a nebolo nám ho ani treba. Táto sekcia je však o zavádzaní PHP do webstránok a aby sme si mohli ukázať ďalšie veľmi praktické použitie, ktoré si preberieme v nasledujúcej kapitole, je nutné, aby sme vedeli pracovať s týmto typom premennej. Len pre opakovanie, premenná je nejaký identifikátor – názov, ktorý ukazuje na dané miesto v pamäti a tam si môžeme uložiť akúkoľvek hodnotu. Podľa toho, akú hodnotu si tam uložíme, určujeme aj typ premennej. Spolu sme sa naučili používať premennú typu boolean (true, false), integer (číslo) a string (reťazec znakov – text).

 

Doteraz sme používali premenné na uloženie jednej hodnoty – jedného údaju. Webstránky - webové informačné systémy, už podľa názvu, pracujú zvyčajne s veľkým množstvom informácií, kde informácie pre nás predstavujú dáta – hodnoty – údaje. Tieto údaje získavame buď od používateľa (cez formuláre) alebo si ich vyťahujeme (načítavame) z nejakého zdroja. Takýmto zdrojom môže byť nejaký textový súbor, v ktorom sú údaje uložené (vpísané), excelovský súbor - tabuľka alebo nejaká databáza (úložisko dát – preberieme si neskôr). Práve pomocou jazyka PHP budeme tieto údaje z týchto zdrojov neskôr načítavať. Tieto údaje sa však po načítaní v kóde vo väčšine aj niekam uložia – rozumejme tým, uložíme si ich do premenných, aby sa dalo s nimi pracovať.

 

Predstavte si webstránku, ktorá napríklad vypisuje zoznam žiakov v danom ročníku pomocou tabuľky. Ak by sme to chceli spraviť s doteraz nadobudnutými vedomosťami, buď by sme to robili natvrdo v HTML a ručne do kódu vpísali príslušný počet riadkov (TR) s menami žiakov (do TD) alebo by sme v PHP mali pre každé meno jednu premennú a tie by sme potom vypisovali takisto pracne v bunkách tabuľky. Asi tušíte, že sa to takto pracne nerobí a existuje na to nejaký praktický elegantný systém, ktorý nám ušetrí kopec roboty. Zamyslite sa, ako by sa to dalo vyriešiť, aby sme to nemuseli písať po jednom, ale aby sme nejako ten celý zoznam mohli vypísať automaticky.

 

Možno vás napadlo, že by sme mohli do niečoho (premennej) uložiť celý ten zoznam žiakov s ich menami a nejako celý ten zoznam vypísať naraz (obsah premennej). A presne takto to ideme spraviť, presne na toto slúži typ premennej pole. Premenná typu pole (array) nám umožňuje vložiť viacero hodnôt do jednej premennej – tým pádom jedna premenná obsahuje akokeby viacero rôznych premenných. Ako to teda funguje a prečo ten názov? Predstavte si normálne pole pre pestovanie úrody. Také pole obsahuje viacero riadkov (hriadok – priesad) a v každom z nich je niečo zasadené, môže to byť aj to isté, ale môže to byť aj rôzne. Presne takto funguje naše pole. Bude mať akokeby viacero riadkov, do ktorých si uložíme (zasadíme), čo chceme. Tak ako aj na poli, tak aj v našej premennej budú tieto riadky virtuálne očíslované – pomenované, aby sme ich vedeli identifikovať a aby sme sa medzi nimi vedeli nejako orientovať a pristupovať k nim.

 

Ďalšie dobré prirovnanie pre premennú typu array sú vagóny vlaku. Jedna premenná tohto typu je akokeby vlak s vagónmi. Každý vagón obsahuje jednu premennú – jednu hodnotu a každý vagón má svoje meno alebo číslo, ktoré ho reprezentuje. Pri práci s touto premennou môžeme hodnoty na danej pozícii (daný vagón/priesada) meniť, pridávať alebo aj odoberať. Vytvorenie premennej tohto typu sa prevádza príkazom array(). Keď sa pozriete na tento príkaz, už by ste mali hneď vedieť, že to bude nejaká vstavaná funkcia jazyka PHP, keďže sú tam zátvorky a asi bude niečo vracať (return) – po priradení tohto príkazu do premennej nám vráti prázdne pole. Čiže určíme typ premennej, ktorá ale nebude ešte nič obsahovať.

 

Pomocou parametrov tejto funkcie môžeme pri priraďovaní vložiť ľubovoľný počet hodnôt do nášho poľa, ako už vieme, jednotlivé parametre oddeľujeme čiarkou. Čiže ak chceme do poľa vložiť postupne tri hodnoty, napr. písmená abc, vyzeralo by to $pole = array('a', 'b', 'c');. Po takomto príkaze sme našej premennej priradili postupne tri vagóny, ktoré sú číselne zoradené, dané číslo určuje ich pozíciu, kde vagón 0 má hodnotu a, vagón 1 má hodnotu b a vagón 2 má hodnotu c. Všimnite si, že sa čísluje od nuly. Keď už máme tieto hodnoty, resp. vagóny zadefinované, ako sa k nim dostaneme a ako ich môžeme meniť? Práve podľa toho poradového čísla – indexu, budeme k nim pristupovať. Podľa toho je aj odvodený názov tohto typu poľa – indexované (indexed array). Premenná $pole obsahuje celé pole, aby sme sa dostali konkrétne ku jednej hodnote (vagóna), musíme do hranatých zátvoriek k premennej vpísať číslo – index, čiže napríklad druhá položka poľa je $pole[1]. Týmto spôsobom vieme dodatočne do poľa prídávať nové prvky alebo meniť už existujúce. Aby sme na začiatok veľa nepísali, poďme si to vyskúšať, kód budeme skúšať za includnutie menu v súbore index.php:

 

<?php

echo "<h2>1 - prazdne pole</h2>";
$pole1 = array();
echo "Pole1 : ".$pole1."<br><br>";

echo "<h2>2 - pole s tromi prvkami</h2>";
$pole2 = array("a", "b", "c");
echo "Pole2 : ".$pole2."<br>";
echo "Pole2 : ".$pole2[0].$pole2[1].$pole2[2]."<br><br>";

echo "<h2>3 - Pridanie prvku na koniec pola</h2>";
$pole1[] = "Janko Mrkvicka";
echo "Pole1 0: ".$pole1[0]."<br>";
echo "Pole1 1: ".$pole1[1]."<br>";
echo "Pole1 2: ".$pole1[2]."<br>";
$pole1[] = "Janko Mrkvicka 2";
echo "Pole1 0: ".$pole1[0]."<br>";
echo "Pole1 1: ".$pole1[1]."<br>";
echo "Pole1 2: ".$pole1[2]."<br><br>";

echo "<h2>4 - Pridanie prvku na konkretnu poziciu</h2>";
$pole1 = array();
$pole1[2] = "Janko Mrkvicka";
echo "Pole1 0: ".$pole1[0]."<br>";
echo "Pole1 1: ".$pole1[1]."<br>";
echo "Pole1 2: ".$pole1[2]."<br><br>";
?>

 

Poďme sa pozrieť pozornejšie na náš kód. Jednotlivé sekcie sme oddelili pomocou nadpisu h2. Všimnite si, že sme zbytočne neuzatvárali a neotvárali kód jazyka PHP pred a po každom nadpise a kód pre nadpis sme nezadávali čisto v HTML, ale že sme to rovno vypísali cez echo v rámci PHP. Toto je jedna z možností, ako písať kód HTML, príkaz echo pošle prehliadaču iba obsah úvodzoviek, takže prehliadač to dostane ako čistý kód v HTML. Za výpisy sme používali aj tag br, aby sme to nemali všetko zlepené dokopy, ale aby to bolo prehľadnejšie.


V prvom prípade sme do premennej pole1 vložili prázdne pole, čiže sme len v podstate určili typ premennej. Pri výpise tejto premennej dostaneme len slovo array. Ak by sme chceli vypísať konkrétne nejaké hodnoty tejto premennej na ľubovoľnej pozícii (na indexe), nedostali by sme nič, pretože na daných pozíciách nič nie je, je to iba prázdne pole. V druhom prípade sme do premennej pole2 vložili pole pomocou funkcie array s parametrami, takže naše pole obsahuje rovno tri hodnoty – tri prvky. Všimnite si, že pri výpise pomocou iba názvu premennej dostaneme vždy iba slovo array. V druhom výpise už vypisujeme konkrétne prvky poľa, konkrétne na pozíciách 0,1 a 2. Ako je vidieť, tieto hodnoty tak skutočne sú uložené.


V treťom prípade sme do prázdneho poľa pole1 priradili hodnotu Janko Mrkvička. Všimnitie si, že premennú sme už mali zadefinovanú (v prvom časti), takže sme nemuseli použiť funkciu array, ale rovno sme priradili hodnotu. Použili sme zápis priradenia na pozíciu, kde do hranatých zátvoriek zadávame index, na ktorý chceme hodnotu priradiť – do ktorého prvku. My sme však index nepoužili, zadali sme iba prázdne zátvorky. Týmto spôsobom priraďujeme hodnotu automaticky na koniec poľa, takže do vagóna, ktorý pripojíme na koniec nášho vlaku – poľa. Následne pre overenie vypisujeme prvé tri prvky poľa, aby bolo vidno, že naša hodnota sa nachádza v prvom prvku. Následne sme priradili ešte jednu hodnotu do poľa a po výpise je vidieť, že ju zaradilo na koniec, takže na druhú pozíciu – s indexom 1. V poslednej časti je znázornené priradenie hodnoty do prázdneho poľa (na začiatku si ho vymažeme, resp. prepíšeme jeho obsah novým prázdným poľom funkciou array()) na prvok s konkrétnou pozíciou, ako je vidieť vo výpise, prvok sa naozaj nachádza na pozícii s indexom 2.

 

V ukážke boli znázornené spôsoby, ako si pole vytvoríme, ako vieme doňho vkladať hodnoty a ako ich následne na konkrétnych pozíciach upravovať. Vráťme sa ale k nášmu problému so zoznamom žiakov. Takýto zoznam by sme už vedeli naplniť do premennej typu pole. Ako ho ale nejako šikovne vypísať napríklad formou tabuľky? Potrebujeme na to mechanizmus, ktorým si celé pole prejdeme – to znamená, že ním budeme prechádzať od začiatku až po koniec, postupne po každom prvku. Začiatok v tomto prípade znamená index 0 a koniec posledný index, kde je nejaká hodnota. Prechádzaním pola rozumejme, že čítame prvky postupne na pozíciach 0, 1, 2, 3 až po posledný index. Keď sa na to takto pozriete, možno vám to niečo pripomenulo. Ak vám to pripomenulo cyklus FOR, tak ste mysleli správnym smerom. Presne týmto cyklom budeme indexované polia prechádzať. Spomeňte si, ako sme používali cyklus FOR. Na začiatku sme zadali počiatočnú hodnotu indexu, potom sme zadali výraz, aby sa tento index po každom kroku cyklu zväčšoval o jedna a zadaním podmienky sme určili, koľkokrát sa má cyklus opakovať. To je presne to, čo potrebujeme – chceme čítať hodnoty od indexu 0 a niečo vykonať a následne zvýšiť index o jedna a zopakovať to isté. Nastáva tu však ešte jeden problém.

 

Ako zadáme správnu podmienku, koľkokrát sa má cyklus vykonať? V našom prípade si hodnoty do poľa budeme priradovať ručne – mechanicky (jednoduchým priradením pomocou =), takže budeme vedieť, koľko hodnôt sme zadali, čiže koľkokrát máme vykonať cyklus, aby sa vypísali všetky prvky. V praxi sa to však ale takto nerobí, vo väčšine je množstvo dát priradených do poľa automaticky, takže nevieme, aké a koľko hodnôt obsahuje. Tým pádom nevieme posledný index poľa, resp. nevieme, koľko prvkov naše pole obsahuje, čiže aká je jeho dĺžka. Presne na to existuje funkcia jazyka PHP s názvom count (count – počet), ktorá po zadaní poľa ako jej parametra vráti číselne jeho dĺžku, čiže počet prvkov. Upozorníme len na jeden fakt, že aby bolo použitie tejto funkcie správne, myslite na to, že pole, ktoré má napríklad päť prvkov má posledný index s hodnotou 4, keďže sa čísluje od nuly, takže treba na to myslieť pri zadávaní podmienky na ukončenie cyklu. Keďže už vieme začiatok poľa a aj jeho koniec a ovládame aj cyklus FOR, nemal by byť pre nás problém toto pole vypísať. Aby sme to nerobili úplne jednoducho, skúsime to rovno do tabuľky. Naša úloha je teda nasledovná, potrebujeme premennú typu pole, v ktorej bude povedzme 10 mien a následne chceme tieto mená vypísať do tabuľky pomocou cyklu FOR tak, že na jednom riadku bude poradové číslo v prvom stĺpci a v druhom stĺpci meno. Skúste sa nad tým zamyslieť a vyskúšajte si do súboru page2.php, či by ste to vedeli zvládnuť sami. Ak nie, pozrite sa na nasledujúcu ukážku, ktorú si nižšie vysvetlíme:

 

<h2>Zoznam ziakov</h2>
<?php

//deklaracia pola
$pole = array("Jano", "Fero", "Lujza", "Barbora", "Michal", "Lenka", "Katarina", "Peter", "Jozef", "Karol");
$dlzka_pola = count($pole);     //zistenie dlzky pola

//moznosti vypisu uvodzoviek
// echo "<table border='1'>";
// echo '<table border=''1''>';
echo "<table border=\"1\">";

    for($i = 0; $i < $dlzka_pola; $i = $i + 1){
        //pre kazdy prvok pola vypiseme jeden riadok tabuky
        echo "<tr><td>".($i + 1)."</td><td>".$pole[$i]."</td></tr>";
    }

echo "</table>";
?>

 

 

Stručne by sa dala táto ukážka popísať nasledovne. Na začiatku si vytvoríme premennú typu pole a priradíme do nej 10 hodnôt. Následne si do premennej dlzka_pola priradáme počet prvkov v našom poli pomocou funkcie count. Následne otvoríme tag pre tabuľku a v jeho vnútri pomocou cyklu for prechádzame celé pole. V každom kroku cyklu vypíšeme riadok tabuľky a do buniek vložíme poradové číslo, čiže hodnotu indexu zväčšenú o jedna (pretože nechceme mať od nuly poradové číslo ale od jednotky ako je zvykom) a hodnotu prvku poľa – meno. Všimnite si, ako šikovne sa dá použiť číselný index $i pri práci s poľom. Premennú určujúcu dĺžku poľa sme použili do podmienky pre ukončenie cyklu, pokiaľ je náš index menší ako veľkosť poľa (10), tak cyklus beží, čiže bude platiť pre indexy 0 až 9. Tu si dávajte pozor, že pole je indexované od nuly a tým pádom je posledný koniec vždý menší o jedno, ako dĺžka poľa. Takže podmienka musí byť menšie a nie menšie rovné, aby sa cyklus nevykonal aj jedenásty raz pre index 10, pretože na danej pozícii nie je žiadna hodnota. Na konci už len tabuľku uzavrieme.


Vrátil by som sa ešte k tagu na otvorenie tabuľky. Príkazom echo vypisujeme hodnotu premenných, stringy, zadané texty alebo kód jazyka HTML. Obsah tohto príkazu dávame do dvojitých úvodzoviek, lebo sme sa to tak naučili. Problém ale nastáva v prípade, že potrebujeme v obsahu nášho príkazu echo, čiže medzi dvojitými úvodzovkami, použiť znak dvojitých úvodzoviek. To je aj náš prípad, pretože pre lepší vizuálny výsledok tejto ukážky chceme použiť atribút tabuľky border, aby sme mali znázornené orámovanie tabuľky. Ako si dobre pamätáme, hodnotu atribútov sme sa tiež učili zadávať do dvojitých úvodzoviek. Ak by sme len natvrdo zadali dvojité úvodzovky vo vnútri dvojitých úvodzoviek príkazu echo, program by to automaticky bral ako koniec príkazu echo a očakával by buď prilepenie niečoho ďalšieho (cez bodku) alebo ukončenie, čiže bodkočiarku. Nemá skade vedieť, že práve tú dvojitú úvodzovku chceme my brať ako znak úvdzovky a nie ukončenie príkazu. Na to, aby sme povedali príkazu echo, aby to bral ako znak, je nutné zadať pred tento znak spätné lomítko (backslah \). Tento špeciálny znak (spätné lomítko) sa zadáva pred istú skupinu špeciálnych znakov, na ktoré akokeby musíme takto upozorniť. K ďalším takýmto znakom sa dostaneme neskôr... Takže jeden spôsob, ako vyriešiť tento problém je, dať pred úvodzovky backslash, ako vidno v ukážke. Stringovú (textovú) hodnotu príkazu echo alebo aj atribútov v HTML však môžeme zadať aj do jednoduchých (jednoritých) úvodzoviek, ako je vidieť o riadok vyššie v zakomentovanom kóde. Takže tieto spôsoby môžeme medzi sebou kombinovať, hodí sa to práve v tomto prípade, kde napríklad hodnotu príkazu echo môžeme ohraničiť dvojitými, ale vo vnútri budeme na všetko používať jednoduché úvodzovky. Keďže to nie je ten istý znak, príkaz echo to bude brať ako normálny znak, nie ako svoje ukončenie, takže nie je potrebné zadávať spätné lomítko. Skúste si zakomentovať echo s dvojitými úvodzovkami a odkomentovať príkazy vyššie, aby ste videli, že to funguje:)

Máte nejakú otázku alebo Vám niečo nie je jasné? Napíšte nám na info@zacni-programovat.sk a poradíme!

Obsah súborov projektu po tejto prednáške

1 - global.css

.pretty{
color: black;
text-decoration: none;
border: 3px solid green;
background-color: white;
text-align: center;
padding: 10px 50px;
}

.pretty:hover{
background-color: green;
color: white;
border: 3px solid blue;
}

.pretty:active{
background-color: yellow;
color: blue;
border: 3px solid blue;
}

2 - index.php

<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="global.css">
</head>

<body>

<h1>Vitajte na domovskej stranke!</h1>
<?php include "menu.html";?>

<?php

echo "<h2>1 - prazdne pole</h2>";
$pole1 = array();
echo "Pole1 : ".$pole1."<br><br>";

echo "<h2>2 - pole s tromi prvkami</h2>";
$pole2 = array("a", "b", "c");
echo "Pole2 : ".$pole2."<br>";
echo "Pole2 : ".$pole2[0].$pole2[1].$pole2[2]."<br><br>";

echo "<h2>3 - Pridanie prvku na koniec pola</h2>";
$pole1[] = "Janko Mrkvicka";
echo "Pole1 0: ".$pole1[0]."<br>";
echo "Pole1 1: ".$pole1[1]."<br>";
echo "Pole1 2: ".$pole1[2]."<br>";
$pole1[] = "Janko Mrkvicka 2";
echo "Pole1 0: ".$pole1[0]."<br>";
echo "Pole1 1: ".$pole1[1]."<br>";
echo "Pole1 2: ".$pole1[2]."<br><br>";

echo "<h2>4 - Pridanie prvku na konkretnu poziciu</h2>";
$pole1 = array();
$pole1[2] = "Janko Mrkvicka";
echo "Pole1 0: ".$pole1[0]."<br>";
echo "Pole1 1: ".$pole1[1]."<br>";
echo "Pole1 2: ".$pole1[2]."<br><br>";
?>

</body>
</html>

3 - menu.html

<a href="index.php" class="pretty">Domov</a>
<a href="page2.php" class="pretty">Stranka 2</a>

4 - page2.php

<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="global.css">
</head>

<body>

<h1>Vitajte na stranke 2!</h1>
<?php include "menu.html";?>

<h2>Zoznam ziakov</h2>
<?php

//deklaracia pola
$pole = array("Jano", "Fero", "Lujza", "Barbora", "Michal", "Lenka", "Katarina", "Peter", "Jozef", "Karol");
$dlzka_pola = count($pole); //zistenie dlzky pola

//moznosti vypisu uvodzoviek
// echo "<table border='1'>";
// echo '<table border=''1''>';
echo "<table border=\"1\">";

for($i = 0; $i < $dlzka_pola; $i = $i + 1){
//pre kazdy prvok pola vypiseme jeden riadok tabuky
echo "<tr><td>".($i + 1)."</td><td>".$pole[$i]."</td></tr>";
}

echo "</table>";
?>

</body>
</html>

Ťažko sa vám učí samému?

Máte problémy s niektorými časťami alebo sa neviete učiť sám? Využite našu možnosť individuálnej asistencie:

  • samostatný prístup
  • vysvetlenie nejasností prebraného učiva
  • úlohy a cvičenia navyše
  • všetko z pohodlia domova cez mail a skype

Pre viac info kliknite tu

Kľúčové slová prednášky

polearrayphp polepole v phparray v phppremenna typu pole polia v jazyku phparray() php

IT ftip

"Haló, hot line? Nám to stále píše, aby sme vložili disketu, čo máme robiť?" "A vložili ste disketu?" "Nie, to nás nenapadlo."