traži:  
 php.com.hr > Rad sa nizovima

Rad sa nizovima
 


Nizovi su osnovni tip elementa koji se najčešće susreće u radi sa bazama podatak. Naime, kada se izvrši upit na bazu vraćeni rezultat je niz. Zato je potrebno znati baratati nizovima i shvatiti njihovu logičku strukturu. Osnovne operacije nad nizovima su šetanje kroz niz, sortiranje niza, pretraživanje niza te lijepljenje niza u string što je već objašnjeno u prethodnom poglavlju.

 

Primjer 25 a) : Šetanje kroz jednodimenzionalni niz

<?

// a) setanje kroz jednodimenzionalni niz.

$arr_valute=array("USD","EUR","GBP","HRK");

foreach ($arr_valute as $kljuc=>$vrijednost)

echo "[$kljuc] => $vrijednost <br>";

?>

 

Objašnjenje:

Ovo je tehnika koja bi već trebala biti poznata jer je korištena kroz cijeli vodič za ispisivanje sadržaja niza. Za šetanje smo koristili foreach petlju koja u svakom svom ponavljanju uzima novi element iz niza. Uzima ih od manjeg indeksa prema večem.

Isti ovaj učinak se može postići na više raznih načina, od kojih je jedan da prvo provjerimo ukupan broj elemenata niza te for petljom prošećemo kroz niz.

for($i=0;$i<count($arr_valute);$i++)

echo "[$i] => $arr_valute[$i] <br>";


Da bi saznali broj elemenata u nizu koristili smo funkciju count($arr_niz) koja vreća ukupan broj elemenata varijable. Ova tehnika kao što se može vidjeti iz gornjeg primjera radi savršeno za jednodimenz sa numeričkim indeksima.

Što ako se radi o asocijativnom nizu?

U tom slučaju će prva metoda šetanja pomoću foreach petlje raditi savršeno, ali postoje i alternative. Naime, u PHP-u možemo sami određivati koji element niza želimo obrađivati pomoću internog pointera niza. Pointer niza zamislite kao strelicu koja nam pokazuje na kojem se elementu niza nalazimo u danom trenutku. Osnovne funkcije ovakvog načina rada su pomicanje slijedeći – prijašnji te pribavljanje trenutnog indeksa i vrijednosti.

Ovom metodom se šetanje obavlja na slijedeći način.

Primjer 25 b): Šetanje kroz niz korištenjem pointera niza

// Asocijativni niz

$arr_assoc=array(

"USD" => 9,

"EUR" => 8,

"GBP" => 10,

"HRK" => 1);

reset($arr_assoc); // resetiranje niza na pocetak

do{

$kljuc=key($arr_assoc); // pribavlajnje klljuca

$vrijednost=current($arr_assoc); // pribavljanje

echo "[$kljuc] => $vrijednost <br>";

} while (next($arr_assoc));

Objašnjenje:

Ovaj primjer je univerzalno šetanje kroz jednodimenzionalni niz, iako postoje i druge slične metode. Da bi bili sigurni da će šetanje uvijek početi od prvog unesenog elementa potrebno je prije petlje koja obavlja šetanje vratiti pokazivač niza na početni elemente – resetirati ga. To obavlja funkcija reset($arr_niz).

Druga bitna stvar koju je potrebno uočiti u ovom primjeru je korištenje do..while petlje. Ona je korištena zbog svoje osobine da se njen blok naredbi uvijek izvrši barem jednom prije provjeravanja uvjeta ponavljanja.

U samoj petlji izlučujemo indeks i vrijednost elementa na kojeg trenutno pokazuje pokazivač (pointer) niza. Za svako ponavljanje petlje pokazivač se prenosi za jedno mjesto unaprijed. Redoslijed kojim se pokazivač pomiče je u slučaju asocijativnog niza po redu unosa (prije unesene vrijednosti su na redu prije od kasnije unesenih vrijednosti). Ovo pravilo ne vrijedi nakon sortiranja niza. Nakon njega redoslijed kretanja pokazivača je onakav kako ga je namjestilo sortiranje.

Za izlučivanje trenutnog ključa koristi se funkcija

key($arr_niz)

a za trenutnu vrijednost se koristi funkcija

current($arr_niz)

Kao uvijet ponavljanje do … while petlje primjer koristi funkciju next($arr_niz) .

Funkcija prebacuje pokazivač niza na slijedeći element u nizu, a ukoliko ne postoji slijedeći element funkcija vraća False i petlja se prestaje izvršavati.

Suprotna radnja od ove bi bilo ispisivanje elemenata niza od zadnjeg prema prvom. Ovo se izvode tako da se niz prvo namjesti na zadnji element pomoću funkcije end($arr_niz) ,

a u uvjetu ponavljanja petlje se koristi funkcija prev($arr_niz) koja pomiče pokazivač niza za jedno mjesto unazad.

Primjer 26: Šetanje kroz multidimenzionalni niz

Primjer koristi rekurzivno pozivanje funkcije

<?

// funkcija za setanje kroz niz

function proseci($niz,$pomak=0){

echo "<pre>";

foreach ($niz as $kljuc => $vrijednost){

for ($i=0;$i<$pomak;$i++)

echo "\t";

if (is_array($vrijednost)){

echo "[$kljuc] => \n";

proseci($vrijednost,$pomak+1);

} else {

echo "[$kljuc] => $vrijednost\n";

}

}

echo "</pre>";

}

// nas niz

$arr_multidim=array(

0 => array("francuz","bijeli","polubijeli","crni","kifla"),

1 => array(3.5, 5, 4, 3, 0.5),

"kasa" => 500

);

// poziv setanja kriz niz

proseci($arr_multidim);

?>

 

Objašnjenje:

Ovo je malo kompliciraniji primjer zbog korištenja rekurzivnog zvanja funkcije sa default vrijednosti argumenta. Uz to, pri izradi funkcije je uzet u obzir i krajnji izgled rezultata. Razlog ovome je očit. Bez formatiranog ispisa bilo bi vrlo teško odgonetnuti koji ključ (indeks) pripada kojoj dimenziji niza.

Zanimljiva stvar koju možete primijetiti kod ovog multidimenzionalnog niza je da se u PHP-u mogu kombinirati razni tipovi niza (numerički i asocijativni) te da nema predodređenog tipa vrijednosti u nizu za cijeli niz. Vrijednosti unutar jednog niza mogu varirati po volji programera ili potrebi same skripte.

Idemo pogledati funkciju.

 

function proseci($niz,$pomak=0){

echo "<pre>";

foreach ($niz as $kljuc => $vrijednost){

for ($i=0;$i<$pomak;$i++)

echo "\t";

if (is_array($vrijednost)){

echo "[$kljuc] => \n";

proseci($vrijednost,$pomak+1);

} else {

echo "[$kljuc] => $vrijednost\n";

}

}

echo "</pre>";

}


Kao što sam već prije rekao, radi se o funkciji da default argumentom. Riječ je argumentu $pomak. Prije nego što kažem za što njega koristimo idem prvo pokušati ukratko opisati što radi ova funkcija.

Očito je da funkcija kao ulazni parametar prima niz, nebitno koje dimenzije, te stvara formatirani ispis tog niza. Za formatiranje su korišteni tzv. escape znakovi \n za novi red i \t za tabulatore. Iz tog razloga je potrebno sav ispis umetnuti između <pre> … </pre> tagova jer bi u protivnom cijeli ispis bio u jednom redu. Ispis se formatira na taj način da se svaka nova dimenzija niza ispisuje za jedno 'tabulatorsko' mjesto udesno. I ovdje dolazi defaultni argument na djelo. Pomoću njega govorimo funkciji u kojoj se dimenziji nalazimo tj. za koliko mjesta treba pomaknuti ispis udesno. Bez ovog pomicanja bilo bi teško odrediti pripadajuće dimenzije i indekse pošto se ponavljaju za svaku dimenziju. Istina, funkcija se mogla riješiti i bez defaultnog argumenta, ali radi jednostavnosti, razumljivosti i čistine krajnjeg koda je ipak upotrijebljen. Ovako se u glavnom programu funkciji daje samo niz, a funkcija se sama brine za formatiranje ispisa.

Sada kada je svrha i funkcija funkcije opisana idemo se pozabaviti njenom logikom. Pošto funkcija ispisuje niz logično je da ćemo se prošetati nizom. Najjednostavniji način za to je foreach petljom. Slijedeća stvar koju je potrebno napraviti je utvrditi kojeg je tipa trenutni element niza. Nas zanimaju dva tipa. Niz i neniz.

Ukoliko se radi o nizu njega je potrebno ispisati na isti način kao i njegovog roditelja, tj. dimenziju u kojoj se on nalazi. Ukoliko se ne radi o nizu želimo ispisati vrijednost na ekran.

Za ispitivanje tipa varijable postoji asortiman funkcija za tu namjenu. Nama je potreban funkcija is_array($varijabla) koja, kako joj ime govori, ispituje da li je zadana varijabla niz. Ukoliko je niz, rezultat je true, a u suprotnom je rezultat false.

if (is_array($vrijednost)){

echo "[$kljuc] => \n";

proseci($vrijednost,$pomak+1);

}

Ovaj blok koda se izvršava ukoliko je trenutna vrijednost niz. On ispisuje trenutni ključ (indeks) na kojem se nalazimo i prenosi ispis u novi red. Slijedeći korak je pozivanje ove iste funkcije, ali ovog puta joj dajemo drugi argument.

Sada je bitno razumjeti za što služi drugi, default argument. Pomoću njega formatiramo ispis. On označava pomak udesno naspram trenutnog pomaka. Pomak se realizira for petljom prije bilo kakvog ispisa u foreach petlji. Ovime osiguravamo da će svaki element dimenzije, ukoliko nije niz biti ispisan na istom pomaku, ili ukoliko je niz njegov indeks će biti u tom pomaku, a njegovi elementi će opet biti pomaknuti za jedno mjesto udesno.

for ($i=0;$i<$pomak;$i++)

echo "\t";

Drugim riječima, argumentom $pomak govorimo skripti koliko se duboko nalazimo u nizu.

 

} else {

echo "[$kljuc] => $vrijednost\n";

}


U slučaju da element niza nije i sam niz, ispisuje se njegova vrijednost i indeks te se ispis prenosi u novi red.  



PHP
 © 2004 - 2008 php.com.hr