II. Notiuni de baza6. Structuri repetitive

Moderatori: Moderators, Founder

Mesaj

Avatar utilizator
CEO
Posts
3802
Operatii cu variabile. Structuri repetitive
O structura repetitiva este o secventa de cod ce permite realizarea repetata a aceleiasi operatii de un anumit numar de ori. O structura repetitiva este definita de 2 elemente: operatia care este executata si conditia de oprire a executiei. In unele cazuri se cunoaste si numarul de executii (sau iteratii).

Iata cateva aplicatii care implementeaza anumite tipuri de structuri in PHP:

Structura repetitiva for

Se foloseste atunci cand se cunoaste dinainte numarul de repetitii (numarul de pasi ce se vor executa). Are urmatoarea sintaxa:

for( [instructiune1] ; [conditie] ; [instructiune2] ) { [instructiune3] }
unde:

instructiune1 este o instructiune de executat la inceput
conditie este o expresie care daca este evaluata ca adevarata va determina repetarea ciclului - este denumita generic conditia de repetare
instructiune2 se va executa la fiecare pas al repetarii
instructiune3 reprezinta operatia efectiva care se repeta in cadrul FOR-ului
In general, [instructiune1] este o expresie de initializare de forma $i = 1, conditia de repetare este de forma $i <= numarul de pasi si [instructiune2] este o expresie de incrementare $i++.

for( $i = 1; $i <= 10; $i++ ) { echo $i; // instructiune3 }
In limbaj natural, intructiunea se traduce prin "plecand de la $i = 1, executa operatia si creste-l pe $i cu o unitate; apoi repeta totul atat timp cat $i <= 10

De retinut: instructiunea din cadrul for-ului se executa doar daca expresia (conditia) este adevarata, deci pot exista situatii cand expresia este falsa si [instructiune3] nu se executa niciodata. Exemplu:

for( $i = 0; $i > 10; $i++ ) { echo 'Aceasta instructiune nu se executa niciodata, pentru ca valoarea ' . 'initiala a lui $i nu este mai mare decat 10'; }
-----------------------------

Structura repetitiva while

Instructiunea while este folosita atunci cand nu se cunoaste dinainte numarul de executii. Are o forma mai intuitiva decat for si multe persoane o considera mai usor de folosit. Diferenta dintre while si for este aceea ca prima este mai generala si mai flexibila. Se poate chiar afirma ca for este o situatie particulara a unei structuri while. Sintaxa este urmatoarea:

while( [conditie] ) { [instructiune] }
Este probabil usor de inteles ca [instructiune] se executa atata timp cat [conditie] este adevarata. La fel ca si la for, exista posibilitatea ca instructiunea sa nu fie executata niciodata.

Mai jos este un exemplu de structura repetitiva while care are acelasi rezultat ca secventa de cod de mai sus ce foloseste for. Se poate observa ca in cazul structurii while conditia are la baza, de multe ori, o variabila initializata in exterior si modificata in interior. In cazul de mai jos, $i este modificata la fiecare executie, pana cand, la un moment dat, va fi mai mare decat 10 ceea ce va determina iesirea din bucla repetitiva.

$i = 0; while( $i <= 10 ) { echo $i; $i++; // la fiecare pas $i creste cu o unitate }
De retinut: este de datoria programatorului sa includa in blocul din structura repetitiva si codul necesar iesirii din bucla. Daca acest lucru nu se realizeaza, codul se va executa la nesfarsit. Exemplu:

$continua = true; while( $continua == true ) { echo 'La nesfarsit', '
'; } echo 'Aici nu se mai ajunge';
Varianta corecta a exemplului de mai sus este urmatoarea:

$continua = true; while( $continua == true ) { echo 'La nesfarsit', '
'; $continua = false; # modific variabila de testare a conditiei } echo 'Acum se ajunge aici';

----------------------------------

Structura repetitiva do... while

O alta structura repetitiva este do... while. Diferenta fata de while este ca verificarea de face la final, dupa ce se executa cel putin o data secventa de cod. O traducere in cuvintele noastre ar fi: "executa secventa si, cat timp conditia este adevarata, repet-o".

Structura do... while are urmatoarea forma:

$i = 0; do { echo $i; $i++; } while( $i <= 10 );
Se poate observa o asemanare foarte mare cu structura while, singura diferenta fiind pozitionarea conditiei fata de codul executat, ceea ce asigura minim o executie a codului, chiar daca evaluarea conditiei determina iesirea din bucla. Astfel, daca la for si while este posibil ca secventa de cod din cadrul structurii repetitive sa nu se execute niciodata, in cazul do... while bucla va avea cel putin o executie.

In exemplul de mai jos codul se va executa o data, chiar daca $i nu corespunde conditiei. Verificarea lui se va face oricum dupa executarea blocului din interiorul structurii. Evaluarea conditiei va determina iesirea din structura repetitiva, fara o alta repetare a executiei.

$i = 11; do { echo $i; $i++; } while( $i <= 10 );
Structura do... while este destul de rar folosita in practica, dar este utila pentru situatiile in care este nevoie de minim o executie a codului.

O aplicatie practica de folosire a structurii repetitive do... while este prezentata mai jos. Secventa de cod de mai jos afiseaza prima aparitie a valorii 0 intr-un sir de numere cu lungimea de minim 1.

/* avem un vector cu un numar necunoscut de valori; vrem sa cautam valoarea 0 * folosind o structura repetitiva. intrucat vectorul are minim 1 element, putem * folosi structura do... while, care va face cel putin o repetare */ $vector = array( 3, 4, 5, 1, 2, 9, 76, 42, 2, 9, 6, 0, 4, 1, 10 ); # operatia: se verifica daca elementul curent al vectorului este 0 # conditia de repetare: elementul curent nu este 0 si nu s-a ajuns la finalul vectorului # nota: in acest caz putem afla numarul de elemente al vectorului, in functie de care # putem defini numarul maxim de repetari, deci putem folosi si structura for # alternativ putem folosi si structura while $pozitie = 0; // plecam de la primul element // parcurgem vectorul pana cand ajungem la final sau gasim valoarea 0 do { // presupun mai intai ca elementul de la repetarea curenta este 0 $gasit = true; // verific daca elementul curent (initial primul element) este diferit de 0 // cu alte cuvinte, deocamdata nu am gasit ce caut, deci merg mai departe if( $vector[ $pozitie ] != 0 ) { $gasit = false; } // trec la pozitia urmatoare pentru verificare $pozitie++; } while ( !$gasit && $pozitie < count( $vector ) ); if( $gasit == true ) print "Am gasit 0 pe pozitia $pozitie"; else print "Nu am gasit 0 in vectorul asta"; /* afiseaza Am gasit 0 pe pozitia 11 */
-----------------------------------

Iterarea cu foreach

PHP ofera o structura repetitiva foarte puternica si des folosita: foreach. Aceasta permite iterarea prin toate elementele unui vector. Pot fi folositi si vectori simpli si asociativi.

Spre deosebire de celelalte instructiuni, pentru foreach nu trebuie specificata explicit o conditie de oprire, fiind de datoria interpretorului PHP sa opreasca iterarea atunci cand s-a ajuns la finalul vectorului.

// parcurgerea unui vector cu foreach $vector = array( 3, 4, 5, 1, 2, 9 ); // afiseaza: 3 4 5 1 2 9 foreach( $vector as $element) { print "$element "; } // parcurgerea unui vector cu foreach, folosind cheile si valorile $vector = array( 'a', 'b', 'c', 'd', 'e', 'f' ); // afiseaza: a b c d e f foreach( $vector as $cheie => $element) { print "$element "; } // afiseaza: 0 1 2 3 4 5 foreach( $vector as $cheie => $element) { print "$cheie "; } // Nota: chiar daca $vector nu este asociativ in mod explicit, // elementele sale oricum au chei implicite valorile 0, 1, 2, 3 ... // vector asociativ (definit explicit cu chei) $zile = array( 'luni' => 'Mo', 'marti' => 'Tu', 'miercuri' => 'We', 'joi' => 'Th', 'vineri' => 'Fr', 'sambata' => 'Sa', 'duminica' => 'Su' ); // afiseaza Mo Tu We Th Fr Sa Su foreach( $zile as $eng) { print "$eng "; } // afiseaza si cheia si valoarea intr-un text foreach( $zile as $rom => $eng) { print "$eng inseamna $rom
"; } /* afiseaza Mo inseamna luni Tu inseamna marti We inseamna miercuri Th inseamna joi Fr inseamna vineri Sa inseamna sambata Su inseamna duminica */
-------------------------------------------------------

Intreruperea fluxului de executie

In toate structurile repetitive prezentate mai sus, executia poate fi intrerupta, partial sau total, folosind instructiunile continue sau break.


continue
Instructiunea continue permite oprirea iteratiei curente a unei structuri repetitive si trecerea imediata la iteratia urmatoare. Folosind continue toate instructiunile din blocul structurii sunt sarite pentru iteratia curenta, iar executia continua cu iteratia urmatoare. Un exemplu:

for($i = 0; $i < 10; $i++) { /* la toate executiile in care $i <= 5, se va "sari" peste * instructiunile print; practic, dupa apelul continue, * executia "trece" la pasul urmator, crescandu-l pe $i */ if( $i <= 5 ) { continue; } print $i; print "
\n"; }
In exemplul de mai sus avem o structura repetitiva for cu 10 executii (de la 0 la 9). Pentru iteratiile in care $i este sub 6, se va executa instructiunea de control continue, care va sari peste tot ce urmeaza (doua instructiuni print) si va forta trecerea la iteratia urmatoare. Asadar, la finalul executiilor se vor afisa doar numerele de la 6 pana la sfarsit.

De retinut, continue afecteaza doar iteratia curenta; celelalte iteratii se pot executa complet, atat timp cat continue nu este apelata din nou. Nu este nici o diferenta de la o structura repetitiva la alta (for, while, do while) - continue se comporta la fel.


break
Instructiunea break permite intreruperea totala a executiei structurii curente si trecerea la urmatoarea linie de cod. Folosind break toate instructiunile din blocul structurii sunt sarite pentru toate iteratiile (curenta si cele urmatoare). Practic se "iese" fortat din blocul structurii repetitive, iar fluxul de executie continua cu instructiunea de dupa structura repetitiva.

Testeaza
for($i = 0; $i < 10; $i++) { // cand $i == 2, se va "iesi" din structura if( $i == 2 ) { break; } print $i; print "
\n"; } print "Gata!"; // cand $i == 2 se "sare" direct aici, ignorand celelalte iteratii
Spre deosebire de continue, instructiunea break afecteaza toate iteratiile unei structuri; nici o alta iteratie a blocului structurii nu se mai realizeaza dupa break.

Un apel break are acelasi efect pentru toate structurile repetitive. In plus, instructiunea se poate folosi si in alte structuri de control, cum este switch, avand ca efect "iesirea" din blocul de selectie.


Structuri multiple
In cazul in care exista structuri repetitive multiple, incluse unele in interiorul celorlalte, instructiunile break si continue pot primi ca parametru nivelul structurii pe care o afecteaza. Spre exemplu, daca avem 2 for-uri ca in secventa de cod de mai jos, apelul break 1; se refera la for-ul din interior, pe cand break 2; se refera la primul for (cel cu $i).

Testeaza
$n = 7; for($i = 0; $i < $n; $i++) { // la fiecare iteratie a lui $i, avem un alt for echo 'Iteratia #', $i, ': '; for($j = 0; $j < $n; $j++) { if( $i == 4 && $j == 4 ) { break 2; // se aplica la for-ul mare } if( $j >= $n - $i ) { continue 1; // se aplica la for-ul din mijloc } print "$j "; } print "\n"; }
De obicei, se recomanda evitarea unor astfel de constructii, intrucat codul devine greu de urmarit si pot sa apara usor probleme. De cele mai multe ori, nici nu va fi nevoie sa apelati continue sau break cu parametru, dar in orice caz, incercati sa evitati pe cat posibil intreruper iteratiilor pe mai multe nivele.


Diferenta dintre break si exit
Intrucat am vorbit despre intreruperea executiei, este posibil sa apara confuzii intre break si exit sau die. Este adevarat ca atat break cat si celelalte intrerup executia secventei de cod, doar ca aceasta intrerupere se realizeaza la niveluri diferite. Astfel, break actioneaza doar la nivelul structurii din este apelat, pe cand exit si die actioneaza la nivelul intregului script PHP.

Instructiunea break va intrerupe executia structurii care o contine, dar va permite continuarea executiei cu alte instructiuni ce urmeaza. Exit sau die nu mai permit nici o alta executie.
========================
CONTACT : diliulro@yahoo.com
========================
Închis