Utisci korisnika

Kada sam na fakultetu polagala ispit iz Obrazovne tehnologije jedno od pitanja je bilo nastava na daljinu. Pojam, značenje, prednosti i nedostaci su mi bili poznati ali u isto vreme daleki, nedostižni…

Pre svega želim da vam se zahvalim na veoma brzom i profesionalnom pristupu. Jovan Knežević - Hong Kong


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: - Core PHP Programming

Modul: Kontrola toka

Autor: Vladimir Marić

Naziv jedinice: For petlja


Materijali vezani uz ovu lekciju:

- Test for petlja
- For petlja (PDF dokument)



U programiranju je često potrebno ponoviti isti blok naredbi nekoliko puta. Ovo ponavljanje se postiže upotrebom petlji. PHP ima nekoliko tipova petlji, ali se, kada se izuzmu razne varijacije, broj petlji svodi na dve for i while petlje. U ovoj lekciji, reći ćemo nešto više o for petlji.


For petlja

For petlja se koristi kada se unapred zna tačan broj koliko puta je potrebno izvršiti neki blok naredbi. Ova petlja ima sledeću sintaksu:

 for (inicijalizacija; uslov; povećanje) {
  blok naredbi;
 }


Prvi parametar se koristi da kreira i postavi početnu vrednost brojaču. Drugi parametar sadrži uslov za brojač, a treći određuje na koji način se brojač povećava. Sledeći primer koda ispisuje pozdravnu poruku 4 puta:

<?php
for ($brojac=1; $brojac < 5; $brojac++) {
 echo "Dobro došli!" . "<br/>";
}
?>


Prvo se vrednost promenljive $brojac postavlja na 1. Drugi parametar sadrži uslov. Blok naredbi će se izvršavati dok god je ovaj uslov tačan. Treći parametar povećava promenljivu $brojac za jedan.

For petlje se često koriste za prolazak kroz nizove. Na primer:

<?php
//kreira se novi niz od pet elemenata
$boje = array('crvena', 'zelena', 'plava', 'zuta','bela');

//koristi se for petlja za prolaz kroz niz i ispisivanje njegovih elemenata
for ($i = 0; $i < sizeof($boje); $i++)
{
 echo "Vrednost elementa $i+1 is $boje[$i].";
}
?>


Gore kreirani niz ima pet elemenata; pri tom su indeksi elemenata u rasponu od 0 do 4. Zbog toga se, u uslovu, koristi stroga nejednakost, da program ne bi pokušao da pristupi elementu sa indeksom 5, koji ne postoji.

Znamo da postoje tri dela inicijalizacije for petlje. U prethodnim primerima je svaki deo imao po jedan parametar, ali ovo nije i obavezna struktura. Ponekad možemo u jednoj inicijalizaciji definisati više parametara.
 
Sledeća petlja će inicijalizovati promenljive $i i $a i dodeliti im različite vrednosti. Zatim, postavlja neki uslov (da $i bude manje od 10), a zatim, interveniše na obe vrednosti, povećavajući ih za jedan.

for($i=0,$a=5;$i<10;$i++,$a++)
    echo $i . ":" . $a . "<br>"


Ali, sintaksni preduslov ne podrazumeva čak ni unos sva tri parametra. Sledeći primer će takođe biti validan:

for($i=0;$i<10;) echo $i++;


U primeru, treći parametar je izostavljen. On, zapravo, nije izostavljen, samo je potpuno prazan, što pokazuje oznaka ; iza broja 10.

Nakon ovakve inicijalizacije, inkrementiranje smo izvršili u samom bloku, što može biti veoma opasno, jer, ukoliko dođe do izostanka inkrementa, možemo pasti u takozvanu mrtvu petlju (petlja se izvršava beskrajno) koja će, u najboljem slučaju, blokirati okruženje.

Mrtve petlje se generalno treba paziti, jer postoje razni načini da se ona proizvede. Jednostavno, pazite da vaša petlja ne izgleda tako da njeni uslovi za izvršavanje mogu biti uvek ispunjeni. Na primer: for($i=1;$i>0;)  echo $i++;

Primećujete da su prehtodna dva primera napisana u jednom redu. To je zbog istog pravila koje važi i za sve ostale strukture za kontrolu toka. Nakon uslova, možete napisati samo jedan red koda bez zagrada. Ukoliko hoćete da napišete neki blok (dve linije i više), morate ceo blok staviti u vitičaste zagrade.

Vodite računa o tome da će vrednosti petlje ostati i nakon izvršenja petlje, tako da, ako napišete:

for($i=0;$i<10;$i++)
    echo $i;


vrednost $i nakon izvršenja će biti 10. Zato je najbolje da se držite nekih standardnih naziva promenljivih, koje ćete koristiti samo u tu svrhu. Na primer, baš slovo i. Tako ćete uvek znati da vam je to slovo rezervisano za petlju i nećete ga upotrebljavati za aktuelne promenljive. Naravno, ovo je samo savet. Za nazive promenljivih u petljama važe ista pravila kao i za nazive svih ostalih promenljivih u PHP-u.

For petlje možete gnjezditi jednu u drugu. Čak, kroz praksu, videćete da se veći programi upravo i sastoje iz petlji koje se nalaze u nekim većim petljama, a koje se, opet, nalaze u nekim, još većim petljama. Kada budete i sami počeli da pravite neke kompleksnije strukture (sa ugnježđenim petljama) pazite na redosled izvršavanja petlji. Ne zaboravite da se vaš program, ma koliko bio kompleksan, izvršava sekvencijalno i da će, ukoliko u bilo kom trenutku započnete neki proces, svi ostali procesi biti zaustavljeni sve dok taj proces ne završi (naravno, ovo pravilo ne važi za programiranje u realnom vremenu i multitasking programiranje).

for($i=0;$i<10;$i++)
    for($u=0;$u<10;$u++) 
        echo $u;

Ovaj primer će jasno ispisati promenljivu $u 100 puta. Ali, kolika će biti ta promenljiva $u u svakom trenutku izvršavanja?

Pošto je petlja $i spoljašnja petlja, i petlja $u se izvršava unutar nje, svaki put kada se dogodi jedna iteracija petlje $i, izvršiće se kompletan ciklus petlje $u.

prva iteracija petlje $i
 prva iteracija petlje $u
 druga iteracija petlje $u
 ... 
 deseta iteracija petlje $u
druga iteracija petlje $i
....

i tako, sve do poslednje iteracije petlje $i, kada će i ceo njen ciklus biti završen.

Na početku petlje smo pomenuli da se brojač petlje „povećava”. Ovo nije obavezno pravilo. Brojač se može i smanjivati, pa čak (što smo videli u jednom od prethodnih primera) ne mora ni postojati.

for($i=10;$i>0;$i--) echo $i;


Foreach petlja

Ova petlja je varijacija for petlje, namenjena isključivo radu sa nizovima. Naročito asocijativnim. Upravo je to razlog što nećemo previše detaljno ulaziti u opis ove petlje, već ćemo samo reći par reči o osnovama njenog funkcionisanja, jer prosto, još uvek nismo obradili nizove.

Ona ima dva oblika. Jedan podrazumeva rukovanje vrednostima, a drugi rukovanje ključevima i vrednostima.

Foreach funkcioniše veoma jednostavno (sa strane korisnika) jer, praktično, nije potrebno ništa da znamo o nizu kroz koji hoćemo da prođemo osim njegovog imena. Pri inicijalizaciji, unosimo naziv niza i naziv promenljive za koju želimo da preuzima aktuelnu vrednost niza prilikom svake iteracije. Ili u drugom obliku, aktuelne vrednosti ključa i vrednosti:

Prvi oblik podrazumeva :

 foreach (niz as $vrednost)
      {
      blok naredbi
      }


Kod prvog oblika prolazi se kroz niz i prilikom svake iteracije, vrednost tekućeg elementa se smešta u promenljivu $vrednost. U bloku naredbi je, zatim, moguće koristiti ovu promenljivu, a da pri tom originalna vrednost sadržana u tekućem elementu niza ne bude promenjena.


Pogledajte sledeći primer:

<?php
$moj_niz = array('crvena','zelena','plava');
 
echo "Boje sadrzane u nizu su: ";

foreach($moj_niz as $value)
 {
 $boje .= $value . " "; 
 }
echo $boje;
 
?>


Tokom svakog prolaska kroz petlju, vrednost tekućeg elementa se dodeljuje promenljivoj $value. Ova vrednost se zatim dopisuje na promenljivu $boje, zajedno sa jednim praznim karakterom. Na kraju, rezultat će biti:

 Boje sadrzane u nizu su: crvena zelena plava


Drugi oblik foreach petlje je:

 foreach (niz as $indeks => $vrednost)
  {
      blok naredbi
  }


On ima istu funkcionalnost kao i prvi oblik, s tom razlikom što, sem vrednosti samog elementa, koristi i vrednost indeksa i smešta ga u promenljivu $indeks.

Kao što vidite, foreach radi prilično automatski. To je nekada dobro, ali nekada i loše, jer kada radimo sa foreach, ne rukujemo sa članovima niza eksplicitno kroz njihove indekse već samo dobijamo njegove vrednosti, pa se tako za foreach može reći da je dobar kada želimo brzo i jednostavno da izvršimo čitanje nekog niza, ali ne i neke ozbiljnije intervencije na njemu.

Iako u primerima svaka foreach petlja prethodi bloku u vitičastim zagradama, i ovde važi pravilo da ne moraju postojati vitičaste zagrade za samo jednu liniju koda.

foreach (niz as $indeks => $vrednost) echo $vrednost;


Kontrola toka petlje

Kontrolu toka petlje možemo vršiti na nekoliko načina. Prvi način je, svakako, ručnom modifikacijom kontrolne promenljive (brojača).

for($i=0;$i<10;$i++)
    {
        if($i>5) $i=10;
        echo $i;
    }

U primeru smo „rekli” petlji da se izvršava sve dok je promenljiva i manja od deset uz inkrement 1. A zatim smo se, u bloku, „predomislili” i rekli da, ukoliko je brojač veći od 5 (dakle 6), brojač dobije vrednost 10. Pošto je brojač dobio vrednost kojom petlja ne ispunjava uslove za izvršavanje, petlja biva napuštena. Ovo rešenje će funkcionisati, ali je nezgrapno, jer, u tom slučaju, moramo poznavati ciljnu vrednost brojača, što često neće biti moguće (npr. for($i=0;$i<$u;$i++)).

Drugi (pravi) način je upotreba ključne reči break. Ovu reč smo upoznali u prethodnoj lekciji, kada smo rekli da ona bezuslovno prekida blok koda.

for($i=0;$i<10;$i++)
    {
        if($i>5) break;
        echo $i;
    }


Upotrebom ove ključne reči, naša petlja nije previše izgubila na veličini, ali je zato dosta dobila na dinamici, jer sada više ne moramo da znamo krajnju vrednost petlje.
Naredba break može imati i parametar. Ukoliko ga unesemo, break će napustiti blokove u dubini naznačenoj u parametru.

for($i=0;$i<10;$i++)
   {
   for($u=0;$u<10;$u++)
      {
      if($u==5)
      break 2;
      }
   echo $i;
}


Ako pokrenemo ovaj primer, na ekranu neće biti ispisano ništa, iako se break naredba nalazi u unutrašnjoj petlji, koja nam nije neophodna za izvršavanje spoljašnje petlje. Ali, obzirom da u trenutku ispunjenja uslova $u=5 u unutrašnjoj petlji, spoljašnja petlja nije završila još ni jednu iteraciju i nije stigla da ispiše poruku na ekranu, a obzirom da uslov aktivira naredbu break, i da ona ima parametar 2 (znači prekida dva bloka po dubini), prekinuće izvršenje sopstvene petlje, i petlje iznad nje.

Ali, ponekad će se dogoditi da želimo da postavimo neki uslov u toku trajanja petlje, za koji, kada se ispuni, ne želimo da izvršimo iteraciju petlje. Na primer, zamislimo neku ogromnu listu ljudi (nekoliko miliona). Svi ti ljudi se nalaze u bazi podataka i nama je potrebno da izdvojimo određenu grupaciju u kojoj su samo prosvetni radnici.

Recimo da čitanje podataka o zanimanju svakog člana liste traje 1 sekund, a čitanje kompletnih podataka o članu 5 sekundi.

Recimo sada da procedura čitanja podrazumeva: čitanje podataka o zanimanju, mestu stanovanja, čitanje imena, čitanje prezimena... (što kompletno traje 5 sekundi). Ako budemo prolazili kroz kompletnu proceduru za svakog člana, izgubićemo 5 sekundi po članu, što za sve članove iznosi mnogo sekundi. Sa druge strane, možemo odmah, na početku, pogledati da li je član prosvetni radnik (za šta nam treba samo jedan sekund), i, ako nije, odmah preuzeti podatke sledećeg člana sa liste i na taj način uštedeti 4 sekunde. Što je, na pomenutu cifru od nekoliko miliona, priličan broj sekundi.
Ovaj jednostavan primer kod ljudi funkcioniše automatski, ali, programu je, da bi razmišljao na taj način, potrebno to eksplicitno naglasiti. Ovo naglašavanje, vrši se ključnom rečju continue.

Ovako bi izgledao pseudo kod pomenutog primera uz upotrebu ključne reči continue:

for($clanListe=0;$clanListe<1000000;$clanListe++)
    {
        if($clanListe!="prosvetniRadnik")
            continue;
        //OGROMNI KOD KOJI CITA SVE OSTALE PODATKE O CLANU LISTE
        //......
    }

 

Vežba 1

Problem:

Potrebno je napraviti program koji će iscrtati sledeću strukturu:

XXXXXXXXXX
XXXXXXXXXX


Ovo iscrtavanje mora biti realizovano putem for petlje.

Takođe, promenljivima mora biti određeno to koliko će oznaka X biti u jednom redu i koliko će kompletna struktura imati oznaka X.


Pomoć:

Novi red je prilikom emitovanja u HTML moguće ostvariti sledećom naredbom:

echo "<br>";


Rešenje:

<?php
$numElements = 1000;
$numColumns = 20;

for($i=0;$i<$numElements;$i++)
    {
        if($i%$numColumns==0 && $i>0)
            echo "<br>";
            echo "X"; 
    }
?>

 

Vežba 2

Problem:

U aplikaciju ulazi određeni broj koji se nalazi u promenljivoj $selectedNumber. Potrebno je napraviti petlju koja se izvršava onoliko puta, kolika je vrednost promenljive $odabraniBroj i prilikom svake iteracije podiže se na eksponent adekvatan broju trenutne iteracije petlje (prvi krug petlje ^1, drugi krug ^2...).


Pomoć:

PHP poznaje funkciju za eksponent: pow(vrednost,eksponent)


Rešenje:

$selectedNumber = 20;
for($i=1;$i<=$selectedNumber;$i++)
           echo pow($selectedNumber,$i) . "<br>";


Vežba 3

Problem:

Na osnovu sledećih promenljivih:

$a = 5;
$b = 8;

i ugnježđenih petlji, potrebno je napraviti sledeći izlaz:

012345678
100000008
200000008
300000008
412345678


Rešenje:

<?php
  $a = 5;
  $b = 8;
  for($i=0;$i<$a;$i++)
  {       
    echo $i; 
    for($u=1;$u<=$b;$u++)
        {
            if($u==$b || $i==0 || $i==$a-1)  
                echo $u;
            else
                echo "0";
        }
        echo "<br>";
  }
?>


 
Vežba 4

Problem:

U aplikaciju ulaze dve promenljive:

$numberOfCharacters = 50;
$characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";


Potrebno je napraviti aplikaciju koja na osnovu prosleđenog seta karaktera i broja generiše šifru. Šifra mora sadržati mala i velika slova iz liste karaktera $characters. Šifra takođe mora imati onoliko karaktera koliko je naznačeno u promenljivoj $numberOfCharacters.

Šifru je potrebno emitovati na izlaz.


Rešenje:

<?php
$numberOfCharacters = 50;
$characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$allCharacters = $characters . strtolower($characters);
$sifra = "";
for($i=0;$i<$numberOfCharacters;$i++)
    $sifra.=$allCharacters[rand(0,strlen($allCharacters)-1)];
echo $sifra;
?>



Najvažnije iz lekcije:

  1. U PHP-u postoji nekoliko vrsti petlji: for, while, foreach i njihove varijacije
  2. for petlju upotrebljavamo kada znamo njene inicijalne vrednosti (koliko će se puta izvršiti)
  3. For petlja podrazumeva inicijalizaciju iz tri dela: inicijalizacija brojača, uslov brojača i inkrement/dekrement brojača
  4. For petlja ne mora imati sva tri inicijalna parametra
  5. Foreach petlja se koristi za čitanje nizova
  6. Foreach petlja može čitati vrednosti ili ključeve i vrednosti iz niza
  7. Petlja se može bezuslovno prekinuti ključnom rečju break
  8. Iteracija petlje se može preskočiti ključnom rečju continue


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


Molimo Vas unesite svoje podatke i dobićete pristup besplatnim lekcijama.

Ime: 
Prezime: 
Email: