Utisci korisnika

"Ovo je pravi vid doškolovavanja za sve one koji nemaju uslova za redovno školovanje ili su prezauzeti. Nije teško za one koji hoce . Uz vas je i moj sin od 9 godina nesto naučio.…

Pre nepunih mesec dana kupila sam paket kurseva: PRIPREME ZA POLAGANJE CAMBRIDGE INTERNATIONAL DIPLOMA IN BUSINESS. Obično neki opšti utisak formiramo na kraju, ali ja u ovom trenutku želim sa…


Kompletna lista utisaka

Testiranje online

Arhitektura računara

Za one koji žele da znaju više.

Windows OS

Ovo bi svakako trebalo da probate.

Odnosi s javnošću

Koliko znate PR?

Pogledajte još neke od testova

Newsletter

Ukoliko želite da Vas redovno obaveštavamo o novostima sa Link eLearning sajta prijavite se na našu newsletter listu.

Ime:

Prezime:

Email:


Anketa

Arhiva anketa

BAZA ZNANJA


Kurs: PHP programiranje

Modul: Nizovi

Autor:

Naziv jedinice: Višedimenzionalni nizovi i funkcionalnost nad nizovima


Materijali vezani uz ovu lekciju:

- Test višedimenzionalni nizovi i funkcionalnost nad nizovima
- Višedimenzionalni nizovi i funkcionalnost nad nizovima (PDF dokument)



Niz parova (asocijativni niz)

Osim nizova u kojima svaki član ima svoju poziciju određenu indeksom niza, moguće je napraviti i niz u kome su vrednosti vezane za određene ključeve u tom nizu.

Na primer, ukoliko bismo želeli da napravimo niz država, i svakoj državi u nizu pridružimo njen glavni grad, upotrebili bismo ovu vrstu niza. Pri tom, države bi mogle biti ključevi, dok bi vrednosti mogli biti gradovi.

Izgradnja tog niza, izgledala bi ovako:
<?php
$niz = array("srbija"=>"beograd", "francuska"=>"pariz", "engleska"=>"london", "usa"=>"vasington");
?>
... pri čemu vrednost sa leve strane znaka => predstavlja ključ, a vrednost sa desne strane, predstavlja vrednost tog ključa.

Dobijanje vrednosti određenog ključa u ovakvom nizu prilično je jednostavno:
<?php
echo $niz["srbija"];
?>
Ova linija koda, emitovaće vrednost za ključ »srbija« što je u ovom slučaju Beograd.

Za razliku od većine ostalih jezika, php neće prijaviti grešku prilikom unosa duplih ključeva, ali, treba znati da će PHP vratiti samo poslednji iz niza duplih ključeva, pa treba obratiti pažnju da svi ključevi budu unikatni.


Višedimenzionalni niz

Osim jednodimenzionih nizova, koji su obrađeni u prethodnoj lekciji, php je u stanju da prepozna i takozvane višedimenzionalne nizove. Ovakvi nizovi, korisni su za rad sa podacima koji imaju matričnu ili tabelarnu formu.

Na primer, recimo da želimo da uskladištimo podatke u vidu tabele, tako da ta tabela sadrži sledeće kolone: ID, Ime, Prezime, Matični broj.

U tom slučaju mogli bismo iskoristiti dvodimenzionalni niz.
<?php
//inicijalizacija niza
$niz = array();
//kao vrednost u člana niza, inicijalizujemo jos jedan niz
$niz[0]=array(1,"jovan","jovanovic","1111111111111");
$niz[1]=array(2,"petar","petrovic","2222222222222");
$niz[2]=array(3,"stojan","stojanovic","3333333333333");
//emitujemo sadržaj željenog člana niza
echo $niz[0][1];
?>
Ovaj niz smo mogli da napunimo i drugačije, pri samoj inicijalizaciji:
<?php
//U samom konstruktoru prosleđuju se nizovi, kao članovi niza
$niz = array(array(1,"jovan","jovanovic","1111111111111"), array(2,"petar","petrovic","2222222222222"), array(3,"stojan","stojanovic","3333333333333"));
echo $niz[0][1];
?>
Dakle, ukoliko bi želeli da dobijemo iteraciju kroz sva imena ove tabele, napisali bismo kod:
<php
for($i=0;$i<sizeof($niz);$i++)
echo $niz[$i][1]."<br>";
?>

... ili, ukoliko želimo da objavimo sve podatke iz tabele:
<php
for($i=0;$i<sizeof($niz);$i++)
echo $niz[$i][0] . " " . $niz[$i][1] . " " . $niz[$i][2] . " " . $niz[$i][3] ."<br>";
?>
Ova rešenja su praktična kada imamo fiksan broj članova podniza (u ovom slučaju to su kolone naše tabele), međutim, ne i ukoliko želimo da rukujemo nekim dinamičkim podacima, čija količina nije unapred poznata. Na primer, program koji rukuje slikama u kome korisnik može da učita sliku bilo kog formata. U tom slučaju, morali bismo da radimo sa nizovima nepoznate veličine i morali bismo da upotrebimo nešto drugačiji metod za iteraciju kroz njegove članove.

Npr. matrica koja ima vrednosti:
1 2 3 4
5 6 7 8
9 0 1 2
Ova matrica bi u formi niza izgledala ovako:
<?php
$niz = array(
array(1,2,3,4),
array(5,6,7,8),
array(9,0,1,2));
?>
... i lako bi bilo napraviti iteraciju kroz nju, izvedenu iz malopređašnjeg primera.
 
Ali, ukoliko zamislimo da smo, umesto ove poznate strukture, dobili samo jednu promenljivu $niz, čije podatke ne znamo (osim da je dvodimenzionalni niz), morali bismo da pribegnemo drugoj tehnici.
//vrši se iteracija nad spoljašnjim nizom
for($sp=0;$sp<sizeof($niz);$sp++)
    {
    //za svakog člana spoljašnjeg niza, vrši se iteracija elemente njegovog podniza
    for($up=0;$up<sizeof($niz[$sp]);$up++)
        //ispisuje se vrednost trenutne koordinate u nizu
        echo $niz[$sp][$up];
            //ispis novog reda, nakon svake iteracije spoljnog niza
            echo "<br>";
    }

Ali, ni ovo nije dovoljno da bi se sačuvali podaci o nekoj slici, jer slika na svakoj koordinati, poseduje određeni set podataka (o boji). Obzirom da se boja najčešće sastoji od tri vrednosti (ukoliko se radi o RGB modelu), za svaku tačku moraćemo da odvojimo još jedan niz od tri člana.

Postoje naravno i druge, mnogo efikasnije metode da se rukuje ovakvom vrstom podataka (npr. klase).

Da bismo ispunili pomenuti zahtev, potrebno je malo izmeniti dosadašnji kod. Pre svega, recimo da niz koji smo dobili parsiranjem neke slike izgleda ovako:
$niz = array(
array(
array(0,0,0),array(255,255,255),array(0,0,0),array(255,255,255)),
array(array(255,255,255),array(0,0,0),array(255,255,255),array(0,0,0)
),array(array(0,0,0),array(255,255,255),array(0,0,0),array(255,255,255))
);

... tako da je svaki podniz glavnog niza jedan red, a svaki podniz u jednom redu, jedna tačka.

Za iteraciju kroz ovako serijalizovane podatke, mogli bismo iskoristiti sledeći kod:
//prolaz kroz spoljasnji niz
for($sp=0;$sp<sizeof($niz);$sp++)
    {
    //prolaz kroz unutrasnji niz
    for($up=0;$up<sizeof($niz[$sp]);$up++)
        //prolaz kroz clanove unutrasnjeg niza
        for($up1=0;$up1<sizeof($niz[$sp][$up]);$up1++)
            echo $niz[$sp][$up][$up1] . " ";
        echo "<br>";
    }
Jedna od olakšica, koju je moguće koristiti prilikom rada sa višedimenzionalnim nizovima, je foreach petlja. Ova petlja sama vodi računa o veličini i pozicijama članova niza prilikom iteracije, pa je tako dobra za neke jednostavnije operacije. Sa druge strane, ovakav pristup smanjuje kontrolu nad samim članovima niza. Foreach petlja će biti detaljnije opisana u jednoj od narednih lekcija.

Ovako bi izgledalo kretanje kroz melopređašnji niz, korišćenjem foreach petlje:
<?php

$niz = array(
array(array(0,0,0),array(255,255,255),array(0,0,0),array(255,255,255)),
array(array(255,255,255),array(0,0,0),array(255,255,255),array(0,0,0)),
array(array(0,0,0),array(255,255,255),array(0,0,0),array(255,255,255))
);

foreach($niz as $red)
{
    foreach($red as $tacka)
        {
        foreach($tacka as $boja)
            echo $boja;
        }
    echo "<br>";
}

?>

Napredne funkcije nad nizovima

Za prikaz članova niza, bez kretanja kroz pojedinačne članove (kako je rađeno u prethodnim primerima) moguće je koristiti funkciju print_r. Ova funkcija razlaže niz, prikazujući njegove ključeve ili brojeve indeksa i vrednosti koje se nalaze ispod njih.

Na primer:
<?php
$niz = array("srbija"=>"beograd", "francuska"=>"pariz","engleska"=>"london","usa"=>"vasington");
print_r($niz);
?>
imaće sledeći rezultat:
Array ([srbija] => beograd [francuska] => pariz [engleska] => london [usa] => vasington)

array_walk()
Ova funkcija vrši kretanje kroz niz i izvršavanje određene funkcije na svakom članu tog niza. Na primer:
<?php
$niz = array("srbija"=>"beograd", "francuska"=>"pariz", "engleska"=>"london", "usa"=>"vasington");
array_walk($niz,"printf");
?>
Ovaj kod, emitovaće:
beogradparizlondonvasington
Funkcija će proći kroz niz i startovati funkciju printf nad svakim članom niza.

Umesto printf, moguće je kao parametar, priložiti i bilo koju drugu funkciju. Recimo, funkciju koja proverava vrednost i ukoliko ta vrednost ispunjava neke uslove, smešta je u drugi niz.

array_fill()
 Ukoliko želimo da formirano niz ispunjen nekom statičkom vrednošću, možemo upotrebiti ovu funkciju, pri čemu je prvi parametar - početni indeks niza, drugi parametar - broj ubačenih članova, a poslednji parametar - vrednost koja se ubacuje.
<?php
$x=array_fill(0,10,"pozdrav");
print_r($x);
?>
Ovaj kod vraca:
Array ( [0] => pozdrav [1] => pozdrav [2] => pozdrav [3] => pozdrav [4] => pozdrav [5] => pozdrav [6] => pozdrav [7] => pozdrav [8] => pozdrav [9] => pozdrav )

Na ovaj način, moguće je jednostavno kopirati više nizova u drugi niz, odnosno, napraviti višedimenzionalni niz, obzirom da ova funkcija kao parametar može primiti i sam niz.

array_flip()
Menja položaje ključeva i vrednosti. Ukoliko je niz sastavljen od ključeva i vrednosti, napraviće zamenu ključeva i vrednosti, a ukoliko niz nema ključeve, već samo indekse, zameniće indekse članova za vrednosti članova.

Kod:
<?php
$niz = array("srbija"=>"beograd", "francuska"=>"pariz", "engleska"=>"london",  "usa"=>"vasington");
$x=array_flip($niz);
print_r($x);
?>
emituje:
Array ( [beograd] => srbija [pariz] => francuska [london] => engleska [vasington] => usa )

array_pop()
Da bismo razumeli ovu i sledeću funkciju nad nizovima, potrebno je prvo da razumemo dva načina za pristup bilo kakvim kolekcijama podataka u programiranju - FIFO i LIFO. FIFO, što je skraćenica za First In First Out (prvi unutra prvi napolje) podrazumeva da je element, koji je prvi pristupio kolekciji, prvi i napušta kolekciju podataka. Dok LIFO, Last In First Out (poslednji unutra prvi napolje), podrazumeva da element koji je poslednji pristupio kolekciji, prvi napusti kolekciju.

Često se ova dva pristupa porede i sa radnim stolom i redom u pošti.
  • Radni sto (LIFO):
    Ukoliko stavimo gomilu papira na sto, onaj koji smo stavili poslednji, biće na vrhu gomile, i prvog ćemo ga uzeti.
  • Red u pošti (FIFO):
    Onaj ko je poslednji stao u red, poslednji će doći do šaltera.

Identično je i u programiranju: stack (sto) i queue (pošta). Obično se (generalno u programiranju) za ova dva tipa punjenja kolekcije podataka, vezuju i dve funkcije. Za stack to su pop i push, a za queue, dequeue i enqueue.

array_pop() će dakle, izvući i obrisati poslednji element iz niza. Ali i postaviti marker na prethodnu poziciju.

Dakle, sledeći kod će emitovati vasington kao rezultat:
<?php
$niz = array("beograd", "pariz", "london", "vasington");
echo array_pop($niz);
?>
ali će sledeći kod emitovati: vasingtonlondonparizbeograd
<?php
$niz = array("beograd", "pariz", "london", "vasington");
echo array_pop($niz);
echo array_pop($niz);
echo array_pop($niz);
echo array_pop($niz);
?>

Da bi po istom principu dodali element u niz, koristimo funkciju:
array_push()

<?php
$niz = array("beograd", "pariz", "london");
array_push($niz, "vasington");
print_r($niz);
?>


Rezultat je:
Array ( [0] => beograd [1] => pariz [2] => london [3] => vasington )

Ova funkcija, daje rezultat identičan onome koji bismo dobili kada bi vrednost uneli direktno, naredbom:
$niz[]="vasington";

Ali, korišćenje array_push() funkcije daje nešto brži rezultat, zbog čega je bolja pri radu sa većim količinama podataka.


list()
Dodeljuje vrednosti niza prosleđenoj listi varijabli.
<?php
$gradovi = array("beograd","pariz","london");
list($srbija,$francuska,$engleska) = $gradovi;
echo $francuska;
?>

Ovakav pristup dobar je za malu količinu, statičkih podataka.

Rezultat koda će biti:
pariz


Najbitnije iz lekcije

PHP podržava nizove nizova, odnosno, višedimenzionalne nizove.
  1. Da bi se formirao višedimenzionalni niz, za članove niza inicijalizuju se takođe nizovi
  2. FIFO i LIFO su dva različita odnosa prema podacima u kolekciji podataka, odnosno, dve različite vrste kolekcije podataka. FIFO – queue, LIFO – stack.
  3. PHP podržava nizove parova ključeva i vrednosti.
  4. PHP dozvoljava upis istoimenih ključeva ali ključevi u nizu ključeva i vrednosti bi trebali da budu unikatni.
  5. Nizovima se može rukovati preko petlji, funkcija ili putem direktnog pristupa indeksima.


Smatrate da je ova lekcija korisna?  Preporučite je. Broj preporuka:2