Funkcie s poliami

V poslednej kapitole sme sa oboznámili s premennou typu pole, ukázali sme si, ako si vieme takúto premennú vytvoriť, naplniť hodnotami a ako s danými prvkami poľa pracovať – ako k nim pristupovať (zadávať hodnoty na konkrétnu pozíciu, meniť ich...). Nepovedali sme si však, ako vieme konkrétny prvok z poľa odstrániť, pretože na tento úkon je potrebné použiť nejaké vstavené funkcie jazyka PHP, je na to viac možností a má to za sebou aj kus teórie.

 

Najprv si ujasnime, čo znamená vytvoriť prvok poľa, priradiť hodnotu, zmazať ju a aký je rozdiel medzi zmazaním hodnoty na danej pozícii a zmazaním/odstránením prvka z poľa. Ak si vytvoríme pole pomocou funkcie array, jeho dĺžka je 0 – funkcia count by vrátila číslo 0, pretože sme mu nepriradili žiadny prvok a ani hodnotu na konkrétnu pozíciu. Čiže neobsahuje žiadnu priesadu/vagón. Ak si vytvoríme pole, ktoré bude mať napríklad 3 prvky (a,b,c), jeho dĺžka bude číslo 3, má tri prvky s tromi hodnotami, čiže bude mať tri vagóny/priesady. Najjednoduchšie vymazanie hodnoty viete spraviť už aj vy, jednoduchým priradením ničoho na nejakú konkrétnu pozíciu. Ak by sme teda na pozíciu 1 priradili nič, napríklad takto $pole[1] = '''';, hodnota tohto prvku by bola nič – prázdny string. Treba si ale uvedomiť, že týmto úkonom sme iba vymazali, resp. prepísali na nič hodnotu daného prvku (daného vagóna na pozícii 1). Nevymazali/neodstránili sme týmto prvok/vagón/priesadu poľa, počet prvkov v poli je stále 3, aj keď jeden prvok z nich je prázdny.

 

Odstránenie prvku – čiže nielen vymazanie hodnoty na danej pozícii, ale aj odstránenie prvku/vagóna/priesady poľa, sa dá vykonať pomocou dvoch rôznych funkcií s odlišným efektom. Majmä na vedomí, že momentálne sa už bavíme o úkone, ktorý nám zníži aj počet prvkov v poli, čiže funkcia count už vráti číslo o jedno menej. Prvá metóda, ktorou je to možné má názov unset (vymazať) a jej argumentom je konkrétny prvok poľa, ktorý chceme odstrániť, čiže napríklad $pole[1]. Po zavolaní tejto funkcie sa počet prvkov v poli zníži o jedno a prvok na danej pozícii bude odstránení aj so svojou hodnotou, už sa k nemu nedostaneme. Výsledné pole (po vykonaní tejto akcie) bude vyzerať tak, ako keby sme priesadu z poľa na danej pozícii zakryli plachtou a už nepoužívali alebo akokeby sme iba na danej pozícii vo vlaku namiesto vagóna s hodnotou dali nejaký obyčajný prázdny vagón s kolesami bez možnosti niečo naň naložiť – uložiť hodnotu. To znamená, že naše pole na pozícii 0 bude mať prvok s hodnotou a, na pozícii 1 nebude nič, žiadny prvok ani hodnota a na pozícii 2 bude prvok s hodnotou c. Toto je dôležité, že indexy pôvodných prvkov ostanú nemenné, odstráni sa iba prvok na danej pozícií, ostanem po ňom akokeby diera.

 

Opačné správanie má druhá funkcia, pomocou ktorej je možné odstrániť prvok a je to funkcia array_splice (splice – zviazať/spojiť). Jej názov je veľavravný, pretože jej správanie je ako keby pole pred danou pozíciou odrezať, vybrať prvok na danej pozícii a zvyšok poľa prilepiť k tej prvej. To znamená, že na danom mieste neostane diera, neostane tam tá priesada zakrytá, neostane tam nepoužiteľný vagón, ale na jej miesto sa posunie zvyšok, čiže pripne sa tam nasledujúci vagón. To má za dôsledok to, že prvok s pozíciou, ktorú sme vymazali pomocou tejto funkcie, bude po vykonaní tejto akcie obsahovať hodnotu nasledujúceho prvku. Dĺžka poľa je tiež menšia o jedno, indexy sa ale zmenili. Čiže po odstránení prvka $pole[1] pomocou funkcie array_splice bude na pozícii 0 hodnota a, na pozícii 1 hodnota c a na pozícii 2 už nebude nič, dĺžka poľa je 2, čiže nemá tretí prvok. Zadanie parametrov tejto funkcie je odlišné od funkcie unset. Na vykonanie vymazania jedného prvka v poli musíme zadať tri argumenty. Prvým je naše pole, druhý argument je pozícia – index, odkiaľ chceme mazať/odstrániť prvky a druhé číslo je koľko prvkov chceme odstrániť, v našom prípade by to vyzeralo array_splice($pole, 1, 1);. Dúfam, že ste pochopili rozdiel, ak nie, pochopíte to v nasledujúcej ukážke, ktorú si skúsime do súboru index.php, predchádzajúci kód si môžeme zmazať, nechajme si tam iba includnutie menu:

 

echo "<h2>1 - Vymazanie iba hodnoty prvku</h2>";
$pole = array("a", "b", "c");
echo "Pole[0]: ".$pole[0]."<br>";
echo "Pole[1]: ".$pole[1]."<br>";
echo "Pole[2]: ".$pole[2]."<br>";
echo "Dlzka pola count(\$pole) je ".count($pole)."<br><br>";

$pole[1] = "";
echo 'Vykonanie prikazu $pole[1] = "";<br><br>';
echo "Pole[0]: ".$pole[0]."<br>";
echo "Pole[1]: ".$pole[1]."<br>";
echo "Pole[2]: ".$pole[2]."<br>";
echo "Dlzka pola count(\$pole) je ".count($pole)."<br><br>";


echo "<h2>2 - Vymazanie prvku pomocou funckie unset</h2>";
$pole = array("a", "b", "c");
echo "Pole[0]: ".$pole[0]."<br>";
echo "Pole[1]: ".$pole[1]."<br>";
echo "Pole[2]: ".$pole[2]."<br>";
echo "Dlzka pola count(\$pole) je ".count($pole)."<br><br>";

unset($pole[1]);
echo 'Vykonanie prikazu unset($pole[1]);<br><br>';
echo "Pole[0]: ".$pole[0]."<br>";
echo "Pole[1]: ".$pole[1]."<br>";
echo "Pole[2]: ".$pole[2]."<br>";
echo "Dlzka pola count(\$pole) je ".count($pole)."<br><br>";


echo "<h2>3 - Vymazanie prvku pomocou funckie array_splice</h2>";
$pole = array("a", "b", "c");
echo "Pole[0]: ".$pole[0]."<br>";
echo "Pole[1]: ".$pole[1]."<br>";
echo "Pole[2]: ".$pole[2]."<br>";
echo "Dlzka pola count(\$pole) je ".count($pole)."<br><br>";

array_splice($pole,1,1);
echo 'Vykonanie prikazu array_splice($pole[],1,1);<br><br>';
echo "Pole[0]: ".$pole[0]."<br>";
echo "Pole[1]: ".$pole[1]."<br>";
echo "Pole[2]: ".$pole[2]."<br>";
echo "Dlzka pola count(\$pole) je ".count($pole)."<br><br>";

 

V tejto ukážke sme ukázali tri rôzne situácie. V každej situácii si vypisujeme prvky poľa postupne po zadeklarovaní premennej, pred vykonaním operácie a následne po vykonaní operácie. Pozrite sa na prvú situáciu - je to prípad, kedy iba mažeme hodnotu prvku, resp. mu priraďujeme prázdny string. Pri vypísaní prvku na danej pozícii sa nevypíše nič, dĺžka poľa ostáva nemenná (3). Všimnite si ale jednu vec, pri výpise textu Vykonavanie prikazu... sme použili na obalenie echo hodnoty jednoduché úvodzovky, aby sme vo vnútri nemuseli dával lomítka pred dvojité úvodzovky indikujúce priradenie prázdneho stringu. Pri vysvetľovaní používania jednoduchých a dvojitých úvodzoviek v príkaze echo sme zatiaľ nespomenuli nič ohľadom iného správania. V hodnote príkazu echo s jednoritými úvodzovkami sme použili označenie $pole, čo značí našu premennú. Všimnite si ale, že príkaz echo to v tomto prípade bral ako text, nie ako premennú, čiže vypísal text $pole. V spodnom výpise echo s textom count sme hodnotu príkazu echo obalili do dvojitých úvodzoviek. Pred označenie dolár pred premennou sme ale museli dať lomítko, aby to príkaz echo bral ako znak dolár, nie ako označenie pre premennú. Keby sme to lomítko nezadali, namiesto textu $pole by nám príkaz echo v tomto prípade vypísal Array, pretože by to bral ako premennú. Toto je rozdiel pri používaní jednoduchých a dvojitých úvodzoviek, v jednoritých sa berú aj názvy premenných iba ako text, v dvojitých sa premenné transformujú na ich hodnoty, kľudne si to vyskúšajte, dajte lomítko preč a uvidíte, čo sa vám vypíše.

 

V druhom prípade sme použili funkciu unset. Vo výpisoch je jasne vidieť, že celý prvok na pozícii 1 bol odstránený – odobratý a na jeho mieste ostalo prázdno. Pri výpise tej pozície sa vypíše nič, pretože prvok neexistuje, počet prvkov poľa je 2, takže znížený po odstránení tohto prvku. Index prvku s hodnotou písmena c je 2, pretože sa nič neposúvalo, indexy ostali nezmenené. V treťom prípade pri použití funkcie array_splice je taktiež dĺžka poľa 2, prvok bol odstránený, lenže ako sme spomenuli, pole sa rozdelilo, prvok sa odstránil a zvyšok poľa sa na dané miesto prilepil. Je to vidieť na tom, že písmeno c sa následne nachádza na pozícii s indexom 1, takže prázdno ako v prípade príkazu unset neostalo, zvyšok pola sa posunul a zaradil za prvú časť.

 

Ako ste si možno všimli, začína sa vyskytovať, že používame nejakú vstavanú funkciu jazyka PHP, ktorá niečo vykonáva za nás. Takýchto funkcií je veľké množstvo, my sa nebudeme samozrejme učiť všetky, ale prejdeme si spolu tie najpoužívanejšie a tie, ktoré majú pre nás vo svete webu význam. Všetky tieto funkcie a ich správanie a pravidlá sa dajú ľahko nájsť na internete, k tomu ako ich nájsť a použiť si ešte prejdeme v kapitole osobitne na to určenej. Pre každý typ premennej ako boolean, string, integer alebo array existuje v jazyku PHP veľa funkcií určených najmä na daný typ premennej, ktoré vedia s danou premennou efektívne pracovať. Aj pre premennú typu array sú k dispozícií funkcie, ktoré sú veľmi praktické na použitie, jedna skupina z nich slúži na zoraďovanie prvkov v poli.

 

Pole obsahuje vo väčšine veľký počet prvkov, ktoré sú najčastejšie číselného (integer) alebo textového formátu (string). Jeho obsah sa najbežnejšie vypisuje formou tabuľky alebo nejakých iných zoznamov. Ako iste viete, je zvykom mať takéto formy dát nejako zoradené, najčastejšie podľa nejakého poradového čísla alebo podľa nejakého kľúčového údaju (meno, mail, dátum a podobne). Predstavte si, že máme také pole, ktorého údaje nie sú zoradené, ako napríklad naše pole s menami, ktoré sme použili v minulej kapitole. A máte za úlohu toto pole zotriediť, napríklad zoradiť prvky v tomto poli podľa abecedy. Teórie okolo tohto veľmi obľúbeného problému je strašne veľa, podobne ako postupov, ako to spraviť. Keďže je to jeden z programátorsky náročnejších problémov, nateraz sa tým ale nejdeme zaoberať, dostaneme sa k tomu neskôr... Teraz nám stačí vedieť, že taký problém je a že je to veľmi bežná vec a že jazyk PHP obsahuje viacero funkcií, ktoré to spravia za nás. My si z nich ukážeme narýchlo dve, jedna z nich sa volá sort (zotriediť), ktorý zotriedi prvky v poli vzostupne (ascendning), čiže od najmenšieho čísla po najväčšie alebo podľa abecedy od a po z. K nej opačná – reverzná je funkcia rsort (reverse sorting – opačné triedenie), ktorý zotriedi prvky zostupne, takže od z po a alebo od najväčšieho čísla po najmenšie. Pre zotriedenie poľa stačí túto funkciu zavolať a ako parameter poslať dané pole pre zotriedenie, nie je nutné funkciu priraďovať do novej premennej, vyskúšame si to v súbore index.php:

 

<h2>Triedenie pola</h2>
<?php
$pole = array("Jano", "Fero", "Lujza", "Barbora", "Michal", "Lenka", "Katarina", "Peter", "Jozef", "Karol");

for($i = 0; $i < count($pole); $i = $i + 1){
    echo $pole[$i]." ";
}
echo "<br><br>";

sort($pole);
for($i = 0; $i < count($pole); $i = $i + 1){
    echo $pole[$i]." ";
}
echo "<br><br>";

rsort($pole);
for($i = 0; $i < count($pole); $i = $i + 1){
    echo $pole[$i]." ";
}

?>

 

 

V ukážke sme si najprv dali vypísať pole v pôvodnej podobe, potom po zavolaní funkcie sort, ktorá ho zoradila podľa abecedy vzostupne a následne po zavolaní funkcie rsort, ktorá zoradila prvky v poli zostupne. Tieto dve funkcie sa nám veľmi zídu, celkovo zoraďovanie pola budeme dosť často používať.

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 - Vymazanie iba hodnoty prvku</h2>";
$pole = array("a", "b", "c");
echo "Pole[0]: ".$pole[0]."<br>";
echo "Pole[1]: ".$pole[1]."<br>";
echo "Pole[2]: ".$pole[2]."<br>";
echo "Dlzka pola count(\$pole) je ".count($pole)."<br><br>";

$pole[1] = "";
echo 'Vykonanie prikazu $pole[1] = "";<br><br>';
echo "Pole[0]: ".$pole[0]."<br>";
echo "Pole[1]: ".$pole[1]."<br>";
echo "Pole[2]: ".$pole[2]."<br>";
echo "Dlzka pola count(\$pole) je ".count($pole)."<br><br>";


echo "<h2>2 - Vymazanie prvku pomocou funckie unset</h2>";
$pole = array("a", "b", "c");
echo "Pole[0]: ".$pole[0]."<br>";
echo "Pole[1]: ".$pole[1]."<br>";
echo "Pole[2]: ".$pole[2]."<br>";
echo "Dlzka pola count(\$pole) je ".count($pole)."<br><br>";

unset($pole[1]);
echo 'Vykonanie prikazu unset($pole[1]);<br><br>';
echo "Pole[0]: ".$pole[0]."<br>";
echo "Pole[1]: ".$pole[1]."<br>";
echo "Pole[2]: ".$pole[2]."<br>";
echo "Dlzka pola count(\$pole) je ".count($pole)."<br><br>";


echo "<h2>3 - Vymazanie prvku pomocou funckie array_splice</h2>";
$pole = array("a", "b", "c");
echo "Pole[0]: ".$pole[0]."<br>";
echo "Pole[1]: ".$pole[1]."<br>";
echo "Pole[2]: ".$pole[2]."<br>";
echo "Dlzka pola count(\$pole) je ".count($pole)."<br><br>";

array_splice($pole,1,1);
echo 'Vykonanie prikazu array_splice($pole[],1,1);<br><br>';
echo "Pole[0]: ".$pole[0]."<br>";
echo "Pole[1]: ".$pole[1]."<br>";
echo "Pole[2]: ".$pole[2]."<br>";
echo "Dlzka pola count(\$pole) je ".count($pole)."<br><br>";
?>

<h2>Triedenie pola</h2>
<?php
$pole = array("Jano", "Fero", "Lujza", "Barbora", "Michal", "Lenka", "Katarina", "Peter", "Jozef", "Karol");

for($i = 0; $i < count($pole); $i = $i + 1){
echo $pole[$i]." ";
}
echo "<br><br>";

sort($pole);
for($i = 0; $i < count($pole); $i = $i + 1){
echo $pole[$i]." ";
}
echo "<br><br>";

rsort($pole);
for($i = 0; $i < count($pole); $i = $i + 1){
echo $pole[$i]." ";
}
?>

</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

odobratie prvku z polavymazanie prvku z polapridanie prvku do polapole novy prvokarray splicersortphp sortsort arrayzoradenie polazotriedenie pola v jazyku php

IT ftip

Prečo je Bill Gates tak veľmi bohatý? Pretože za chyby sa platí...