<titlu> l3c7cb
Utilizarea tablourilor</titlu>
<titlu>Scopuri</titlu>
• invatati sa creati un tablou
• invatati sa parcurgeti iterativ un tablou
• invatati sa lucrati cu functii lista
• invatati sa sortati un tablou
• invatati sa folositi tablouri in lucrul cu variabilele dintr-un
formular
In Modulul 2 a fost prezentata notiunea de tablou, un tip de variabila
special, care poate avea mai multe valori asociate. In cadrul acestui modul,
veti invata mai multe despre utilizarea tablourilor.
<titlu>Crearea tablourilor</titlu>
Puteti crea un tablou PHP in doua moduri principale. Puteti atribui o
valoare unei variabile dintr-un tablou sau puteti invoca functia array(). In
aceasta sectiune vor fi explicate ambele metode de creare a unui tablou.
<titlu>Crearea unui tablou folosind atribuiri</titlu>
Modalitatea cea mai simpla de a crea un tablou este de a atribui o valoare unei
variabile de tip tablou. Iata un exemplu simplu in acest sens:
$limbajeai = „Perl”;
$limbajeai = „PHP”;
$limbajeai =”Python”;
Parantezele drepte care urmeaza dupa numele variabilei indica limbajului PHP
ca variabila $limbaje este o variabila de tip tablou. PHP stocheaza in
mod automat valorile atribuite tabloului in celule numerotate succesiv,
incepand de la $limbajea0i. Iata continutul tabloului, asa cum rezulta
din cele trei instructiuni de atribuire:
0 => Perl
1 => PHP
2 => Python
Simbolul => arata ca unei valori ii este asociata o cheie, in
acest caz, cheia 0 este asociata cu valoarea "Perl", cheia 1 este
asociata cu valoarea "PHP", iar cheia 2 este asociata cu valoarea
"Python". Puteti asimila tabloul cu un tabel, caz in care exem¬plul
anterior este reprezentat astfel:
0 Perl
1 PHP
2 Python
Daca doriti, puteti scrie o instructiune de atribuire care specifica o valoare
cheie, astfel incat sa puteti asocia o valoare cu un anumit element
al tabloului. Sa luam in considerare urmatorul exemplu:
$limbajea0i = „Perl”;
$limbajea1i = „PHP”;
$limbajeai =”Python”;
Observati ca instructiunea finala de atribuire nu include nici o valoare de
index. PHP asociaza valoarea "Python" cu urmatorul element consecutiv
al tabloului:
0 => Perl
1 => PHP
2 => Python
Elementele unui tablou nu trebuie asociate unor chei consecutive. Iata un exemplu
care demonstreaza acest fapt:
$limbajea10i = „Perl”;
$limbajea20i = „PHP”;
$limbajeai =”Python”;
Aceste instructiuni de atribuire determina urmatorul continut al tabloului:
10 => Perl
20 => PHP
21 => Python
Remarcati, similar cu exemplul anterior, ca valoarea " Python” este
asociata urma¬torului element consecutiv din tablou.
Asa cum s-a explicat in Modulul 2, PHP nu va obliga sa folositi numere
intregi pe post de chei. Puteti crea un tablou asociativ, cunoscut si
sub numele de tablou indexat cu siruri, prin specificarea drept chei a unor
siruri:
$limbajeaPHPi = „Ridicat”;
$limbajeaPythoni = „Mediu”;
$limbajeaPerli =”Redus”;
Prin instructiunile de mai sus, urmatoarele chei au fost atribuite urmatoarelor
valori:
PHP => Ridicat
Python => Mediu
Perl=>Redus
Semnificatia utilizarii pe post de chei a unor valori intregi consecutive
este aceea ca puteti folosi o bucla for simpla pentru a parcurge iterativ tabloul,
cu alte cuvinte, pentru a examina valorile fiecaruia dintre elementele sale.
Veti invata mai multe despre parcurgerea iterativa a tablourilor in
sectiunea urmatoare, intitulata „Utili¬zarea functiei array()".
<titlu>Utilizarea functiei array()</titlu>
Dincolo de utilizarea instructiunilor de atribuire, cealalta modalitate principala
de creare a unui tablou PHP consta in utilizarea functiei array(). Iata
un exemplu simplu, care creeaza un tablou avand drept chei valori intregi
consecutive:
$limbaje = array(„Perl”, „PHP”, „Python”);
Aceasta instructiune creeaza un tablou care contine urmatoarele asocieri:
0 => Perl
1 => PHP
2 => Python
Daca doriti sa asociati unei valori o anumita cheie, puteti folosi operatorul
=>, astfel:
$limbaje = array(10=>„Perl”, „PHP”, „Python”);
Aceasta instructiune creeaza urmatorul tablou:
10 => Perl
11 => PHP
12 => Python
Ca si in cazul utilizarii unei instructiuni de atribuire pentru crearea
unui tablou valorile cheilor nu trebuie sa fie consecutive si nici macar intregi:
$limbaje = array(„PHP”=>„Ridicat”,”Python”
=>„Mediu”, ”Perl”=>”Redus”);
Aceasta instructiune creeaza urmatorul tablou:
PHP => Ridicat
Python => Mediu
Perl=>Redus
<Sfatul specialistului >
Intrebare: In cadrul altor limbaje de programare, este posibila
crearea de tablouri multi-dimensionale. Se poate proceda astfel si in
PHP?
Raspuns: Un tablou multi-dimensional poate fi asimilat, pur si simplu, unui
tablou ale carui celule contin valori ale unui tablou; cu alte cuvinte, un tablou
de tablouri. De exemplu, sa presupunem ca doriti sa caracterizati usurinta de
invatare si popularitatea mai multor limbaje de scripting. Puteti reprezenta
datele intr-un tabel, in urmatoarea forma:
<tabel>
*Limbaj
*Usurinta in invatare
*Popularitate
*PHP
*simplu
*popular
*Python
*simplu
*nepopular
*Perl
*dificil
*popular
Puteti reprezenta aceste date sub forma unui tablou PHP denumit $date, prin
scrierea urmatoarelor instructiuni:
$datea"PHP"i = array("simplu", "popular");
$datea"Python"i = array("simplu", "nepopular");
$datea"PHP"i = array("dificil", "popular");
Sau puteti scrie urmatoarea instructiune:
$date = array("PHP"=>array(„simplu", "popular")
,
"Python"=>array("simplu","nepopular"),
"PHP"=>array("dificil", "popular"));
</sfatul specialistului>
<Test „la minut">
• Scrieti instructiuni de atribuire PHP care atribuie numele principalelor
culori aditive (rosu, verde si albastru) unor chei numerotate consecutiv ale
unui tablou denumit $culoare.
• Scrieti instructiuni de atribuire PHP care asociaza valorile 100, 1000
si 1000000 cheilor "suta", "mie" si "„milion"
in cadrul unui tablou denumit $marime. </Test „la minut">
<titlu>Parcurgerea iterativa a unui tablou</titlu>
Cand ati stocat date intr-un tablou, puteti obtine acces la valoarea
unui element al tabloului sau ii puteti modifica valoarea prin intermediul
cheii asociate elemen¬tului. De exemplu, sa presupunem ca folositi urmatoarele
instructiuni pentru a crea un tablou:
$xa0i = 1;
$xa1i = 10;
$xa2i = 1000;
Puteti obtine acces la valoarea asociata cheii l prin intermediul unei instructiuni ca aceasta:
$y = 3 * $xa1i;
Similar, puteti modifica valoarea asociata cheii 2 prin intermediul unei instructiunu
ca aceasta:
$xa2i = 100
<nota>
Raspunsuri la test:
• $culoareai = "rosu";
$culoareai = "verde";
$culoareai = "albastru";
•$marimea"suta"i = 100;
$marimea"mie"i = 1000;
$marimea"milion"i = 1000000;</nota>
Uneori, in loc de a obtine accesul la un singur element al unui tablou
sau de a-l modifica, doriti sa obtineti accesul la mai multe elemente ale tabloului.
De exemplu, sa presupunem ca doriti sa determinati daca in tablou exista
o anumita cheie sau valoare. Sau sa presupunem ca tabloul reprezinta salarii
si doriti sa mariti fiecare valoare cu 10 procente. Operatii de acest gen implica
parcurgerea iterativa a tablou¬lui sau, altfel spus, accesul la fiecare
element al tabloului. Aceasta sectiune explica modul de iteratie prin tablouri
secventiale si non-secventiale.
<titlu>Parcurgerea iterativa a unui tablou secvential</titlu>
Un tablou ale carui chei sunt valori intregi consecutive se numeste tablou
secven¬tial. In general, valoarea cea mai mica a unei chei dintr-un
tablou secvential este zero; totusi, puteti crea un tablou secvential folosind
valoarea unu sau orice alta valoare intreaga ca valoare minima a cheii.
In cazul in care cunoasteti valoarea minima a cheii unui tablou
secvential, puteti parcurge iterativ tabloul folosind o bucla for. Pentru aceasta,
initializati variabila de bucla la valoarea cea mai redusa a cheii. Folositi
functia count () pentru a forma expresia de test a buclei. Functia count ()
returneaza numarul elementelor dintr-un tablou. Iata un exemplu simplu de iteratie
intr-un tablou:
$limbaje = array(0=>”Perl”, 1=>”PHP”, 2 =>”Python”);
$limita = count($limbaje); for ($i = 0; $i < $limita; $i++)
A echo <BR>$i => $limbajeaii”;
S
Prima instructiune creeaza tabloul. Cea de-a doua instructiune obtine numarul
elementelor din tablou. Instructiunea for foloseste variabila bucla $i pentru
a parcurge iterativ tabloul; corpul instructiunii include o instructiune echo
care afiseaza cheia si valoarea fiecarui element din tablou. Datele de iesire
se prezinta astfel:
0 => Perl
1 => PHP
2 => Python
<titlu>Cautarea intr-un tablou secvential</titlu>
Pentru a examina modul de utilizare a iteratiilor, sa ne concentram asupra problemei
de a determina daca un tablou contine o anumita valoare. Iata un exemplu:
$limbaje = array(0=>”Perl”, 1 =>”PHP”, 2 =>”Python”);
$cauta =”PHP”;
// se cauta in tabloul $limbaje valoarea $cauta
$limita = count($limbaje); for ($i = 0; $i < $limita ; $i++)
A echo „ <BR> Determinarea unei identitati cu $limbajea$ii;
if (cauta == $limbajea$ii)
A
„<BR>$cauta este un limbaj aprobat.”;
S
S
Prima instructiune creeaza tabloul in care se va cauta. Desigur, intr-o
aplicatie iterativa reala, tabloul nu va fi initializat cu valori literale imediat
anterior operatiei de cautare, intr-o aplicatie reala, continutul tabloului
este supus la variatii.
Cea de-a doua instructiune atribuie valoarea "PHP" variabilei $cauta;
in exemplu, se cauta in tablou valoarea stocata in variabila
$cauta. Dupa comentariu, urmatoarea instructiune obtine numarul elementelor
din tablou si stocheaza aceasta valoare in variabila $limita. Instructiunea
for functioneaza ca mai inainte; de data aceasta insa, corpul sau
contine alte instructiuni si se executa o alta operatie. O instructiune echo
afiseaza valoarea fiecarui element al tabloului pe masura ce iteratia avanseaza.
Instructiunea if testeaza fiecare element si afiseaza un mesaj daca valoarea
elemen¬tului este una si aceeasi cu valoarea variabilei $cauta. Iata rezultatul
rularii exemplului:
Determinarea unei identitati cu Perl
Determinarea unei identitati cu PHP
PHP este un limbaj aprobat.
Determinarea unei identitati cu Python
<titlu>Instructiunea break</titlu>
Observati ca iteratia continua chiar si dupa stabilirea unei identitati. Cand
se cauta intr-un tablou, executia cautarii poate fi sistata dupa gasirea
elementului dorit; continuarea iteratiei in tablou nu face decat
sa iroseasca resursele calculatorului, fara a afecta rezultatele operatiei.
Pentru a opri executia unei iteratii, puteti folosi instructiunea break, care
determina incheierea imediata a buclei care o contine. Iata cum se poate
revizui exemplul anterior, astfel incat sa includa o instructiune
break:
for ($i = 0; $i < $limita ; $i++
A echo „<BR>Determinarea unei identitati cu $limbajea$ii”; if ($cauta == $limbajea$ii)
A
„<BR>$cauta este un limbaj aprobat.”; break;
S
S
Acum, dupa stabilirea unei identitati, instructiunea break provoaca sistarea
buclei for. Iata datele de iesire rezultate, care acum omit examinarea inutila
a elementului tabloului asociat cu limbajul "Python":
Determinarea unei identitati cu Perl
Determinarea unei identitati cu PHP
PHP este un limbaj aprobat.
<titlu>Instructiunea continue</titlu>
O instructiune corelata cu instructiunea break este continue. Instructiunea
continue sisteaza iteratia curenta a buclei, determinand evaluarea imediata
a expre¬siilor de incrementare si de test. Ca un exemplu, sa presupunem
ca doriti sa cautati in tabloul $limbaje pentru a determina numarul limbajelor
care au nume scurte, adica nume alcatuite din maximum patru caractere. Iata
un exemplu care executa aceasta prelucrare a datelor:
$limbaje = array(0=>”Perl”, 1=>”PHP”, 2=>”Python”);
// Numara numele scurte
$scurt = 0;
$limita = count($limbaje); for ($i = 0;$i<$limita; $i++)
A
$n = strlen($limbajea$ii); echo „<BR>$limbajea$ii are $n caractere lungime.”; if ($n4> 4) continue;
$scurt++;
S echo „<BR>Au fost gasite $scurt limbaje cu nume scurte.”;
O instructiune de atribuire stabileste valoarea initiala a variabilei $scurt,
folosita pentru a numara numele scurte gasite, la zero. Instructiunea for se
aseamana celor folosite anterior. Corpul acestei instructiuni difera, desigur,
de cele folosite anterior. Valoarea variabilei $n este stabilita ca fiind egala
cu numarul caracterelor care compun numele limbajului, folosind functia strlen(),
care calculeaza lungimea unui sir. Daca instructiunea if stabileste ca elementul
curent al tabloului face referire la un limbaj cu nume lung, se executa instructiunea
continue. Instructiunea continue determina trecerea iteratiei la urmatorul element
din tablou; daca nu au mai ramas elemente in tablou, bucla for isi
incheie executia. La finalizarea iteratiei, o instruc¬tiune echo afiseaza
numarul numelor scurte de limbaje gasite in tablou. Iata rezultatul:
Perl are 4 caractere lungime.
PHP are 3 caractere lungime.
Pynton are 6 caractere lungime.
Au fost gasite 2 limbaje cu nume scurte.
<titlu>Parcurgerea iterativa a unui tablou non-secvential</titlu>
In unele limbaje de programare, parcurgerea unui tablou non-secvential
este o operatie complicata. Cu toate acestea, PHP 4 include o instructiune foreach
care simplifica iteratiile de acest gen. Instructiunea foreach are urmatoarea
forma generala:
foreach (tablou as $cheie =>$valoare) AcorpS
Instructiunea parcurge in mod iterativ tabloul denumit Atablou, stabilind
valori adecvate pentru valorile variabilelor $cheie si $valoare aferente fiecarui
element al tabloului. Iata un exemplu simplu:
$limbaje = array(10=>”Perl”, 20=>”PHP”, 21=>”Python”);
// parcurge iterativ tabloul foreach ($limbaje as $index => $limbaj)
A echo „<BR>$index =>$limbaj”;
S
Remarcati ca instructiunea echo face pur si simplu referire la valorile variabilelor
$index si $limbaj, carora li se atribuie in mod automat valorile cheii,
respectiv elementului curent. Iata datele de iesire ale exemplului:
10 =>Perl
20 =>HP
21 =>Pynton
<Sfatul specialistului>
Intrebare: Cum pot parcurge in mod iterativ un tablou multi-dimensional?
Raspuns: Pentru a raspunde la aceasta intrebare, sa parcurgem iterativ
un tablou multi-dimensional care contine urmatoarele date:
<tablou>
*Limbaj
*Usurinta in invatare
*Popularitate
*PHP
*simplu
*popular
* Python
*simplu
*nepopular
* Perl
* dificil
*popular
</tablou>
Tabloul poate fi creat folosind urmatoarele instructiuni PHP:
$datea"PHP"i = array(simplu", "popular");
$datea"Python"i = array("simplu", "nepopular");
$datea"PHP"i= array("dificil", "popular");
Pentru a parcurge tabloul in mod iterativ, folositi instructiuni foreach
imbri¬cate:
foreach ($date as $limbaj => $valoare)
A foreach($valoare as $cheie =>$caracteristica)
A echo „<BR>$limbaj:$caracteristica”;
S
S
Instructiunea foreach exterioara obtine tabloul asociat cu fiecare limbaj;
instructiunea foreach interioara parcurge iterativ caracteristicile limbajului.
Iata rezultatul:
PHP: simplu
PHP: popular
Python: simplu
Python: nepopular
Perl: dificil
Perl: popular </Sfatul specialistului>
<Test „la minut">
• Care este instructiunea folosita pentru a parcurge in mod iterativ
un tablou non-secvential?
• Care este functia ce returneaza numarul elementelor dintr-un tablou?
• Care este instructiunea folosita pentru a sista iteratia curenta a unei
bucle?
• Care este instructiunea folosita pentru terminarea imediata a unei bucle?
</Test „la minut">
<titlu>Lucrul cu functii lista</titlu>
In afara de modalitatile de parcurgere iterativa a tablourilor, PHP ofera
numeroase functii care va permit traversarea tablourilor, deplasandu-va
inainte sau inapoi, dupa dorinta. Prima dintre aceste functii este
current(), care returneaza valoarea curent al tabloului. Functia current() foloseste
un pointer intern de tablou pe care PHP il creeaza pentru fiecare tablou.
Cand creati un tablou, pointerul intern de tablou este configurat astfel
incat sa faca referire la primul element al tabloului. Functiile
next() si prev() modifica pointerul intern al tabloului si se pot folosi alaturi
de functia current() pentru a parcurge un tablou. Functia next(), asa cum ii
arata si numele*, modifica pointerul intern al tabloului astfel incat
acesta sa faca referire la urmatorul element, in timp ce functia prev()
modifica pointerul intern al tabloului astfel incat acesta sa faca
referire la elementul anterior.
Iata un exemplu care prezinta modul de operare al functiilor mentionate:
$limbaje = array(10=>”Perl”, 20=>”PHP”,21=>”Python”);
$curent = current($limbaje); echo „<BR>functia current() a returnat $curent”;
$urmator = next($limbaje); echo „<BR>functia next() a returnat $urmator”;
$urmator = next($limbaje); echo „<BR>functia next() a returnat $urmator”;
$anterior = prev($limbaje); echo „<BR>functia prev() a returnat $anterior”;
Iata datele de iesire ale exemplului:
functia current() a returnat Perl functia next() a returnat PHP functia next() a returnat Python functia prev() a returnat PHP
Observati modul in care sunt utilizate functiile prev() si next() pentru
deplasarea inapoi, respectiv inainte, in interiorul tabloului.
<nota>
Raspunsuri la test:
• foreach
• count()
• continue
• break
*In limba engleza next— urmator. (N.T.)</nota>
<titlu> Functia key () </titlu>
Functia key() este corelata cu functia current(). Daca functia current() retur¬neaza
valoarea asociata elementului curent, functia key () returneaza cheia asociata
elementului curent. Iata un exemplu care ilustreaza modul de operare al acestei
functii:
$limbaje = array(10=>”Perl”, 20=>”PHP”, 21=>”Python”);
$curent = current($limbaje);
$cheie = key($limbaje); echo „<BR>functia current() a returnat $curent”; echo „<BR>functia key() a returnat $cheie”;
Datele de iesire ale exemplului sunt urmatoarele:
functia current() a returnat Perl functia key() a returnat 10
<titlu>Functia each()</titlu>
O alta functie utila in parcurgerea tablourilor este each (). Functia
each () returneaza urmatoarea pereche cheie-valoare din tabloul specificat.
Perechea cheie-valoare este returnata sub forma unui tablou asociativ cu patru
elemente, dupa cum urmeaza:
<tabel>
*Cheie
*Valoare
*0
*Componenta cheie a perechii cheie-valoare curenta
*1
* Componenta valoare a perechii cheie-valoare curenta
*"key"
* Componenta cheie a perechii cheie-valoare curenta
*"value"
* Componenta valoare a perechii cheie-valoare curenta
</tabel>
Observati ca puteti folosi valoarea cheie „0" sau „cheie"
pentru a obtine accesul la componenta cheie a perechii cheie-valoare; similar,
puteti folosi valoarea cheie „1" sau „valoare" pentru
a obtine accesul la componenta valoare a perechii cheie-valoare. Iata un scurt
exemplu care ilustreaza modul de operare a functiei each ():
$limbaje = array(10=>”Perl”, 20=>”PHP”, 21=>”Python”);
$fiecare = each($limbaje);
$zero = $eacha1i;
$cheie = eacha‚key’i;
$valoare = $eacha‚value’i; echo „<BR>zero=$zero”; echo „<BR>unu=$unu”; echo „<BR>cheie=$cheie”; echo „<BR>valoare=$valoare”;
Datele de iesire ale acestui exemplu sunt urmatoarele: zero=10 unu=Perl cheie=10 valoare=Perl
<titlu>Functia list()</titlu>
O alta functie utila in lucrul cu tablouri este functia list(), care va
permite sa atribuiti valori la numeroase variabile in cadrul unei instructiuni.
Functia list() este deseori folosita cu functia each(), deoarece functia list()
faciliteaza accesul separat la cheia si la valoarea returnate de functia each
(). Forma generala de utilizare a functiei list() este urmatoarea:
list($var1,$var2,…,$varn)=valoare_tablou;
Fiecare dintre variabilele specificate, de la $var1 la $varn, primeste o valoare
din tabloul valoare_tablou. Intr-un fel, functia list() este opusa functiei
array(), deoarece functia list () imparte un tablou intr-o serie
de valori scalare, in timp ce functia array() construieste un tablou dintr-o
serie de valori scalare.
Iata un exemplu care ilustreaza modul de utilizare a functiei list():
$limbaje = array(10=>”Perl”, 20=>”PHP”, 21=>”Python”); list($cheie, $valoare) = each($limbaje); echo ”<BR>cheie=$cheie, valoare=$valoare”;
$urmator = next($limbaje); echo <BR>urmator=$urmator;
De asemenea, iata datele de iesire ale exemplului:
cheie =10, valoare = Perl urmator = Python
<Test „la minut">
• Care este functia ce va permite sa atribuiti valori mai multor variabile
simultan?
• Care este functia ce returneaza componenta cheie a unei perechi cheie-valoare
asociata elementului curent al tabloului?
• Care este functia ce mareste valoarea unui pointer intern de tablou?</test
la minut>
<Sfatul specialistului>
Intrebare: PHP mai contine si alte functii pentru lucrul cu tablourile?
Raspuns: Da. PHP contine peste 40 de functii pentru lucrul cu tablourile, cu
mult mai multe decat pot fi descrise in acest capitol. De exemplu,
functia array_search() faciliteaza cautarea intr-un tablou. Pentru informatii
despre aceasta functie si despre alte functii utilizate in lucrul cu tablouri,
examinati documentatia PHP in varianta electronica, la adresa https://www.php.net.
</sfatul specialistului>
<nota>
Raspunsuri la test: list() key() next()
<titlu>Sortarea tablourilor</titlu>
Sortarea reprezinta o alta operatie frecvent aplicata tablourilor. PHP furnizeaza
o suita de functii care faciliteaza sortarea unui tablou. De exemplu, un tablou
poate fi creat dupa cum urmeaza:
$limbaje = array(10=>”Perl”, 20=>”PHP”, 21 =>”Python”);
Apoi, doriti sa sortati tabloul in functie de numele limbajului de programare.
Pentru aceasta, pur si simplu invocati functia sort():
Sort($limbaje);
Dupa sortare, continutul tabloului apare asa cum se poate vedea mai jos:
0 => PHP
1 =>Perl
2 =>Python
Observati ca secventa de sortare sau secventa de aranjare (cum este numita
uneori) este sensibila la diferenta intre majuscule si minuscule. Deoarece
litera H mare este sortata anterior literei e mic, PHP apare inainte de
Python in datele de iesire sortate.
Tabelul 8-1 prezinta pe scurt functiile de sortare ale limbajului PHP, inclusiv
rezultatul aplicarii fiecarei functii tabloului folosit in exemplul anterior.
<tabel 8-1 Un sumar al functiilor de sortare ale limbajului PHP>
*Operatie
*Functie
*Rezultat
*Sortarea unui tablou in functie de valoare
*sort()
*0 => PHP
1 =>Perl
2 => Python
*Sortarea unui tablou asociativ in functie de valoare
*asort()
*20 => PHP
10 => Perl
21 => Python |
*Sortarea unui tablou dupa valoare, in ordine descendenta
*rsort()
*0 => Python
1 => Perl
2 => PHP
*Sortarea unui tablou asociativ dupa valoare, in ordine descendenta
*Arsort()
*21 => Python
10 => Perl
20 => PHP
*Sortarea unui tablou sau a unui tablou asociativ in functie de cheie
*ksort()
*10 => Perl
20 => PHP
21 => Python
*Sortarea unui tablou sau a unui tablou asociativ in functie de cheie,
in ordine descendenta
*Krsort()
*21 => Python
20 => PHP
10 => Perl
</tabel 8-1>
<Sfatul specialistului>
Intrebare: Sa presupunem ca doresc sa execut o cautare fara sensibilitate
la diferenta intre majuscule si minuscule. Cum pot proceda?
Raspuns: O modalitate ar fi utilizarea functiei natcasesort(), care sorteaza
un tablou folosind o „ordine naturala", care nu este sensibila la
diferenta intre majuscule si minuscule. O alta modalitate consta in
a utiliza functia usort() sau una dintre functiile sale conexe , in speta
uksort() si uasort(). Aceste functii va permit sa definiti o secventa de aranjare
personalizata, pe care o specificati prin desemnarea unei functii care compara
valorile in conformitate cu secventa de aranjare. Functia usort() sorteaza
valorile din tablou si returneaza un tablou secvential; functia uksort() sorteaza
cheile tabloului, iar functia uasort() sorteaza un tablou asociativ.
De exemplu, urmatoarele instructiuni creeaza un tablou si il sorteaza
intr-o maniera insensibila la diferenta intre majuscule si minuscule:
$limbaje = array("Perl", "PHP", "Python"); usort($limbaje, "strcmpcase");
Functia strcmpcase() este o functie din biblioteca PHP care compara doua siruri
fara a tine cont de marimea literelor (majuscule sau minuscule). Functia returneaza
o valoare negativa daca primul sir este mai mic decat al doilea, zero
daca sirurile sunt identice, respectiv o valoare pozitiva daca primul sir este
mai mare decat al doilea.
Puteti implementa o secventa de aranjare personalizata scriind propria dumneavoastra
functie si specificand numele acesteia ca argument al functiei usort()
sau al uneia din functiile sale conexe. Pur si simplu scrieti o functie care
preia doua argumente sir si returneaza -l, 0 sau +1, in functie de rezultatul
compa¬ratiei intre valorile sir.
Pentru mai multe informatii despre functia usort() si despre functiile sale
conexe, examinati documentatia in varianta electronica, la adresa https://www.php.net.
</sfatul specialistului>
<Test „la minut">
• Care este functia ce trebuie folosita pentru a sorta un tablou asociativ
in ordine descrescatoare?
• Care este functia ce trebuie folosita pentru a sorta un tablou in
ordine ascendenta, in functie de valoarea cheii? </Test „la minut">
<nota>
Raspunsuri la test:
• arsort()
• ksort()
</nota>
<titlu>Proiect 8-1: O reluare a formularului cu persoane de contact</titlu>
In cadrul acestui proiect, veti vedea un exemplu simplu care include parcurgerea
iterativa a tablourilor si sortarea acestora. Proiectul foloseste sistemul de
contact prin e-mail utilizat in proiectele anterioare. Formularul de contact
prin e-mail furnizeaza spatiu pentru introducerea numelor copiilor persoanei
de contact. Acest proiect prezinta modul de sortare a numelor in ordine
alfabetica si modul de afisare a numelor respective.
<titlu>Scopurile proiectului</titlu>
• Prezentarea modului de utilizare a unui tablou ca variabila de formular
• Prezentarea modului de parcurgere iterativa a unui tablou
• Prezentarea modului de sortare a unui tablou
<titlu>Pas cu pas</titlu>
1. Plasati urmatorul script PHP intr-un fisier denumit p-8-1 .php si incarcati
acest fisier in serverul dumneavoastra PHP:
<?php foreach ($copil as $index => $copil)
A echo "<BR>copila$indexi=$copil";
S echo "<BR>";
sort($copii);
foreach ($copii as $index => $copil)
A echo "<BR>copila$indexi=$copil";
S
?>
2. Plasati urmatorul text HTML intr-un fisier denumit p-8-1 .html si
incarcati acest fisier in serverul dumneavoastra, plasandu-l
in acelasi catalog ca si fisierul p-8-1.php:
<HTML>
<HEAD>
<TITLE>Proiect 8-1</TITLE>
</HEAD>
<BODY>
<! -- Fisier p-8-1.html -->
<FORM METHOD=”POST” ACTION=”p-8-1.php”>
<H1>Informatii privind persoana de contact</H1>
<TABLE>
<TR>
<TD>Numele copiilor</TD>
</TR>
<TR>
<TD><INPUT TYPE=”TEXT” NAME=”copiiai”></TD>
</TR>
<TR>
<TD><INPUT TYPE=”TEXT” NAME=”copiiai”></TD>
</TR>
<TR>
<TD><INPUT TYPE=”TEXT” NAME=”copiiai”></TD>
</TR>
<TR>
<TD><INPUT TYPE=”TEXT” NAME=”copiiai”></TD>
</TR>
<TR>
<TD><INPUT TYPE=”TEXT” NAME=”copiiai”></TD>
</TR>
</TABLE>
<BR>
<BR>
<BR>
<INPUT TYPE=”SUBMIT” VALUE=”Trimite”>
<BR>
<BR>
<INPUT TYPE=”RESET” VALUE=”Sterge datele”>
</FORM>
</BODY>
</HTML>
3. Alocati un timp studiului paginii HTML. Casetele text sunt nume care fac
referire la o variabila de tip tablou PHP. De asemenea, parcurgeti scriptul
PHP, studiind modul de functionare a iteratiei care afiseaza numele copiilor.
4. Orientati un browser Web spre adresa URL a fisierului HTML incarcat
anterior. Ecranul browserului trebuie sa fie asemanator celui prezentat in
continuare. Introduceti valori pentru numele copiilor si apoi executati clic
pe butonul „Trimite".
5. La executia scriptului, acesta afiseaza numele copiilor in ordinea
in care au fost introduse. Apoi, numele sunt sortate si afisate in
ordine sortata. Un rezultat caracteristic al operatiei de sortare este prezentat
in continuare.
<ecran>
Contact Information
<campuri>
Childrens Names:
Able
Charley
Baker
Edward
Delta
</campuri>
<buton> submit</buton>
<buton> Clear the form </buton>
</ecran>
<ecran> childa0i=able childa1i=charley childa2i=baker childa3i=edward childa4i=delta
childa0i=able childa1i=charley childa2i=baker childa3i=edward childa4i=delta
</ecran>
<Test de evaluare>
1. Scrieti instructiuni care creeaza un tablou denumit $pop, care asociaza numele
mai multor orase mari cu numarul locuitorilor acestora.
2. Scrieti o instructiune for care parcurge in mod iterativ un tablou
secvential denumit $pitici, unde cheia minima are valoarea unu. Corpul instructiunii
for trebuie sa afiseze numele fiecarui element al tabloului $pitici. Aveti grija
la scrierea expresiei de test, care trebuie sa reflecte faptul ca valoarea cea
mai mica a unei chei este unu, nu zero.
3. Scrieti o instructiune foreach care cauta in tabloul $state un element
a carui cheie are aceeasi valoare ca si variabila $abrev. Afisati valoarea elementului
corespunzator, nu cheia acestuia.
4. Scrieti o instructiune care sorteaza tabloul asociativ $pop in ordine
crescatoare, in functie de valoare.</Test de evaluare>