Invata PHP cu punctsivirgula.ro

I. Introducere
II. Notiuni de baza
III. Notiuni avansate
IV. Aplicatii
V. Extra
C O N T I N U T
Exemple cu structuri repetitive

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.

Mihai a spus Aplicatie - 04.12.2009

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

Alexandru a spus Aplicatie tara - 04.12.2009

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 :)

ADRIAN MARIUS a spus multumiri - 06.08.2010

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

Sergiu a spus Dece da eroare ? - 03.05.2012


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

Alexandru a spus Eroare - 03.05.2012

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/

Sergiu a spus Merci Alexandru - 03.05.2012

acum mi-e clar :)

Adrian a spus eroare - 26.11.2013

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>";
?>

Alexandru a spus Pentru Adrian - 27.11.2013

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.

Daniel a spus La exemplul cu cautarea unei valori intr-un vector - 18.12.2013

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 :)

Alexandru a spus Pentru Daniel - 19.12.2013

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!

Valentin Cosmin a spus Acolo sunt 2 email-uri invalide - 11.03.2015

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.

 


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?

<?php
/* similar exemplului anterior */
 
# operatia repetitiva: afisarea unui element de tip <li> 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 '<ul>';
for( $i = 0; $i < $n; $i++ ) {
	echo <<<LINK
	  <li>
	    <a href="http://{$links[ $i ]}" title="{$links[ $i ]}">{$links[ $i ]}</a>
	  </li>
LINK;
}
echo '</ul>';
 
?>
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 <option>
# conditia de continuare: inca nu s-au efectuat $end repetari
# nota: ca zi in cazul anterior se cunoaste numarul de repetari
 
print "<select>";
for( $i = 1; $i <= $end; $i++ ) {
	print "<option value=\"$i\">$i</option>\n";
}
print "</select>";
Rezultatul codului de mai sus este urmatorul:


Cum afisez un element de tip select cu toate tarile?

<?php
 
# ne trebuie o lista de tari. Cel mai uzual pastram doar codul tarii, iar numele il afisam doar. 
# Astfel, optiunile vor avea ca "value" codul tarii iar ca "text" - numele.
 
$countries = array(
	'AF'=>'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 '<select name="tara">', "\n"; # afisez pe alt rand pentru a aseza  in pagina sursa HTML
foreach( $countries as $code => $name ) {
	echo '<option value="', $code, '">', $name, '</option>', "\n";
}
echo "</select>\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?

<?php
 
# presupunem ca exista mai multe textbox-uri intr-un formular, numite email[] 
$emails = $_POST[ 'email' ]; # pentru detalii despre $_POST vedeti lectia "Formulare"
 
# pentru teste se poate folosi: 
$emails = array( 'ok@test.com', 'zzz', 'test@site', 'test@test.com', 'aaa' );
 
# folosesc o variabila ce actioneaza ca un flag/switch
$gasitInvalid = false;
 
# determin nr de email-uri
$n = count( $emails );
 
# plec de la primul email-uri
$i = 0;
 
// parcurgem vectorul pana cand ajungem la final sau gasim un email invalid
while( $gasitInvalid == false && $i < $n ) {
	// verific daca elementul curent (din iteratia curenta) este invalid
	if( strpos( $emails[ $i ], '@' ) === false || 
	    strpos( $emails[ $i ], '.' ) === false ) {
		# un email valid trebuie sa contina @ si un punct
		$gasitInvalid = true;
		echo 'Am gasit un email invalid: ', $emails[ $i ], '<br />';
 
		//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!<br />';
 
?>

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).