Aplicatii - Structuri repetitive 11
Mai jos sunt prezentate cateva aplicatii legate de structurile repetitive. Sunt mai degraba portiuni de cod, care nu vor face decat sa va ajute sa va obisnuiti cu particularitatile limbajului PHP. Comentariile sunt binevenite.
Cum definesc un vector ale carui elemente sa aiba valori incrementale?
/* vrem sa construim un vector in care fiecare element sa fie initializat
* cu o valoare dinamica si incrementala; avem, asadar, o aceeasi operatie
* care se repeta de mai multe ori, motiv pentru care vom folosi un for */
$vector = array();
$n = 10;
# operatia repetitiva: definirea si initializarea unui element al vectorului
# conditia de continuare: inca nu s-au efectuat $n repetari
# nota: in acest caz cunoastem numarul de repetari, dat de variabila $n
for( $i = 1; $i <= $n; $i++) {
# intre paranteze se specifica expresia de initializare $i = 1
# conditia de continuare $i <= $x si o expresie de iterare $i++
$vector[ $i ] = "php$i"; # aceasta este operatia
}
print_r( $vector );
/*afiseaza:
Array
(
[1] => php1
[2] => php2
[3] => php3
[4] => php4
[5] => php5
[6] => php6
[7] => php7
[8] => php8
[9] => php9
[10] => php10
)
*/
Cum afisez o lista de link-uri?
cu valori dinamice
# conditia de continuare: inca nu s-au efectuat $n repetari
# va trebui sa avem lista de link-uri definita intr-un vector.
$links = array(
'www.punctsivirgula.ro',
'php.punctsivirgula.ro',
'php.punctsivirgula.ro?despre',
'php.punctsivirgula.ro?legal'
);
# determin lungimea listei
$n = count( $links );
# avand lungimea, folosesc o structura for pentru a afisa lista
echo '';
for( $i = 0; $i < $n; $i++ ) {
echo <<
{$links[ $i ]}
LINK;
}
echo '
';
?>
Rezultat:
www.punctsivirgula.ro
php.punctsivirgula.ro
php.punctsivirgula.ro?despre
php.punctsivirgula.ro?legal
Cum afisez un element de tip select cu valori de la 1 la 100?
/* similar exemplului anterior */
$end = 100;
# operatia repetitiva: afisarea unui element de tip
Rezultatul codului de mai sus este urmatorul:
Cum afisez un element de tip select cu toate tarile?
'Afghanistan',
'AL'=>'Albania',
'DZ'=>'Algeria',
'AS'=>'American Samoa',
'AD'=>'Andorra',
'AO'=>'Angola',
'AI'=>'Anguilla',
'AQ'=>'Antarctica',
'AG'=>'Antigua And Barbuda',
'AR'=>'Argentina',
'AM'=>'Armenia',
/* ... */
'WS'=>'Western Samoa',
'YE'=>'Yemen',
'YU'=>'Yugoslavia',
'ZM'=>'Zambia',
'ZW'=>'Zimbabwe'
);
# avand un array asociativ, este mai dificil sa-i accesam elementele, asa ca nu vom
# mai folosi for. Vom folosi in schimb un iterator
echo '\n";
?>
Rezultat:
Cum caut o valoare intr-un vector?
/* avem un vector cu un numar necunoscut de valori; vrem sa cautam valoarea 0
* folosind o structura repetitiva */
$vector = array( 3, 4, 5, 1, 2, 9, 76, 42, 2, 9, 6, 0, 4, 1, 10 );
# operatia repetitiva: se verifica daca elementul curent al vectorului este 0
# conditia de oprire: elementul curent este 0 sau s-a ajuns la finalul vectorului
# nota: desi putem afla numarul de elemente al vectorului, in functie de care
putem determina numarul maxim de repetari, se va folosi structura while
$gasit = false;
$pozitie = 0; // plecam de la primul element
// parcurgem vectorul pana cand ajungem la final sau gasim valoarea 0
while( !$gasit ) { // echivalent cu while( $gasit == false )
// verific daca elementul curent (initial primul element) este 0
if( $vector[ $pozitie ] == 0 ) {
$gasit = true;
print "Am gasit 0 pe pozitia $pozitie";
}
// trec la pozitia urmatoare pentru verificare
$pozitie++;
// spre deosebire de "for" incrementarea trebuie realizata explicit
// verific daca am ajuns la sfarsitul verctorului
if( $pozitie == count( $vector ) ) {
$gasit = true; // ca sa nu mai repete
print "Nu am gasit 0 in vectorul asta";
}
}
# in limbaj natural, instructiunea while se poate transpune in "cat timp
# conditia este indeplinita executa operatiunea"
/* afiseaza
Am gasit 0 pe pozitia 11
*/
Exemplul de mai sus este dat pentru a intelege cand si de ce se foloseste 'while'. Toata verificarea se poate face mult mai rapid folosind o functie oferita de limbaj: array_search.
// alternativa
$vector = array( 3, 4, 5, 1, 2, 9, 76, 42, 2, 9, 6, 0, 4, 1, 10 );
$pozitie = array_search(0, $vector );
if( $pozitie === false ) print "Nu am gasit 0 in vectorul asta";
else print "Am gasit 0 pe pozitia $pozitie";
Cum validez mai multe email-uri introduse de un utilizator?
';
//break;
/* pot folosi break dar este inutil pentru ca se va iesi oricum
din bucla while datorita variabilei $gasitInvalid care e true */
}
$i++; # cresc pe $i
}
# daca s-a ajuns la sfarsitul sirului de email-uri si $gasitInvalid este tot false
# inseamna ca nu exista nici un element invalid
if( !$gasitInvalid ) echo 'Toate email-urile sunt valide!
';
?>
Rezultat:
Am gasit un email invalid: zzz
Nota: se putea folosi si structura repetitiva for pentru ca se cunosteau dinainte numarul de pasi ce trebuiau efectuati. In schimb, folosind aceasta implementare, atunci cand se gaseste un email valid se opreste executia (se iese din bucla while), asadar codul ar putea fi mai performant decat in cazul folosirii for.
Spre exemplu, daca avem un vector cu 15 elemente, iar pe pozitia a doua se afla un email invalid, atunci executia se termina dupa 2 pasi: la primul pas se verifica primul element care este valid, iar la al doilea, gasindu-se un email invalid se iese din ciclul while (din cauza ca $gasitInvalid nu mai este false).
De ce nu raspunde nimeni la comentarii? E un site parasit?
Oricum, daca e cineva:
Afisez select-box cu tarile si cineva le alege... cum fac sa ii citesc tara respectiva
adica sa dea click pe un buton send iar informatia sa ajunga ca mine sau la operator si sa ii citeasca Tara... apoi spre exemplu orasul
Salut Mihai,
Ceea ce ai descris tu se poate realiza cu formulare. Sunt cateva exemple pe site care te-ar putea ajuta. Daca ai nevoie de mai multe informatii lasa un comentariu.
PS: comentariile sunt citite, toate (am primit si mail-ul tau). Raspunsurile, ca si lectiile/exemplele, se fac in functie de timpul liber :)
exemplele sunt foarte bine venite,cu cat mai multe cu atat mai bine,sunt incepator si incerc sa gasesc logica scripturilor,mai ales ca uneori vad combinatii d php cu css si js ,ceea ce ma cam incurca,asvrea un raspuns pe emailul meu la intrebarea: scripturile php sunt excusiv php sau exista cazuri cand se amesteca cod php cu css si js? daca sunt exclusi php atunci sa inteleg ca se scrie codul php apoi in alt document(acelasi editor) se scrie un at cod in css si js si se salveaza in dosarul serverului apache sau iis?in acest fel ele se imbina pe pagina web,fie loca fie pe site direct,ci nu in acelai document creat cu 1 editor, e asa? multumesc
Notice: Undefined index: email in C:\Program Files\EasyPHP5.3.0\www\email.php on line 4 // aici $emails = $_POST[ 'email' ];
Am gasit un email valid: test@test.com
Undefined index: email inseamna ca $_POST nu contine un element cu cheia 'email'.
Cu alte cuvinte in form-ul tau nu ai nici un element <input name="email">. Verifica daca numele elementului scris corect.
Mai multe detalii aici: http://php.punctsivirgula.ro/form/
acum mi-e clar :)
salut .. nu inteleg de ce aici imi da eroare .. deci imi apare in loc de tari 3 erori de tipul " Undefined variable: name in D/php/.... on line 10 acesta este codul pe care l-am facut <?php
$tari = array(
'Ro'=>'Romania',
'En'=>'Anglia',
'Br'=>'Brazilia',
);
echo '<select name="tari">',"\n";
foreach ($tari as $code => $nume) {
echo '<option value="', $code, '">', $name, '</option>', "\n";
}
echo "</select>";
?>
Erorile sunt cauzate de faptul ca folosesti variabila $name cand in cadrul foreach este definita variabile $nume (name/nume, sunt diferite).
Si sunt 3 erori pentru ca instructiunea echo din cadrul structurii foreach se executa de 3 ori (cate o data pentru fiecare element al vectorului $tari), si la fiecare executie se genereaza o eroare.
Corecteaza numele variabilei si va functiona.
Ce conditie ar trebui sa pun la while ca sa nu se opreasca dupa ce imi gaseste primul 0? Acelasi lucru ca si la un exemplu anterior. Daca sirul are mai multi de 0 si eu vreau sa ii gasesc pe toti. Am facut exemplul cu ciclul for si mi-a iesit mult mai usor. Sincer mi se pare greoi cu $gasit acela...Imi cam face creierul franjuri :). Cand am impresia ca nu l-am inteles imi dau seama ca m-am adancit si mai mult in misterul lui.
Acesta este exemplul meu cu ciclul for:
<?php
$sir= array (0, 3, 4, 5, 1, 2, 9, 76, 42, 2, 9, 6, 0, 4, 1, 10,0 );
$n=count($sir);
for ($i=0; $i<$n; $i++)
{if ($sir[$i]==0)
{echo "Am gasit 0 pe pozitia $i","\n","<br/>";
}
}
?>
Dar si la acest exemplu as dori sa va intreb ceva. Cum fac sa afisez in cazul in care sa zicem ca nu exista 0 in sir, un mesaj "In acest sir nu este 0"? Daca il bag in interiorul lui for mi-l afiseaza de fiecare data. Daca il bag in afara structurii, atunci la exemplul meu mi-l afiseaza, dar dupa ce imi afiseaza "Am gasit 0 pe pozitia..." "am gasit 0 pe pozitia...". As fi vrut cumva sa mi-l afiseze doar daca nu e 0 in sir. Dar in acelasi timp, sa il introduc in cod dar daca este 0 in sir sa nu mi-l afiseze? Sper ca nu m-am exprimat prea alambicat. Multumesc :)
Prima intrebare:
Daca vrei sa afiseze toate valorile de 0 trebuie sa modifici conditia de iesire din bucla si sa pui doar verificarea pozitiei: while ( $pozitie < count( $vector ) ); Astfel se vor parcurge toate elementele sirului si nu se va mai opri cand $gasit este true.
A doua intrebare:
Ca sa afisezi un mesaj cand nu gasesti elementul, va trebui cumva sa marchezi faptul ca elementul nu exista in vector. Asta o poti face doar printr-o variabila, care sa ia o anumita valoare doar cand elementul este intalnit (tot nu scapi de $gasit :)
Asadar, in cadrul if-ului, langa echo, va trebui sa pui $gasit = true, sau $marcaj = 1; sau orice altceva (nu trebuie sa folosesti mereu $gasit). Variabila asta o initializezi la inceput de tot cu o valoare diferita, sa zicem $marcaj = 0; si dupa la final, bucla for, mai faci o verificare: daca variabila are aceeasi valoare ca la inceput, if ($marcaj == 0), atunci inseamna ca elementul nu exista (nu s-a intrat niciodata in if-ul din interiorul for-ului) si in cazul asta poti afisa un mesaj specific.
Sper ca are sens pentru tine ce zic. Succes!
Ca sa le gaseasca pe amandoua codul este urmatorul, daca interseazaz pe cineva ;)
<?php
@$emails = $_POST[ 'email'] ;
$emails = array( 'ok@test.eu' , 'waly@goflg.ro' , 'zzzz' , 'aaa' );
$gasitInvalid = false ;
$n = count( $emails );
$i=0;
while ($gasitInvalid == false && $i < $n) {
if (strpos ($emails[$i], '@') === false ||
strpos ($emails[$i], '.') === false) {
$gasitInvalid = true;
echo 'Am gasit un mail invalid: ' , $emails[$i] , "<br>" ;
}
$i++;
$gasitInvalid = false ;
}
$gasitInvalid = true ;
if (!$gasitInvalid) echo 'Toate email-urile sunt valide!<br>';
?>
Adauga un comentariu la aceasta sectiune.