Welcome, guest. You are not logged in.
Language / Choose language
 
Username Password  
Today: WHERE COUNTRY IS BEST IN ASIA? · More of this
    Search
 

   

Modul #8
123

<titlu>Modulul 8:
Utilizarea tablourilor</titlu>
<titlu>Scopuri</titlu>
• învãþaþi sã creaþi un tablou
• învãþaþi sã parcurgeþi iterativ un tablou
• învãþaþi sã lucraþi cu funcþii listã
• învãþaþi sã sortaþi un tablou
• învãþaþi sã folosiþi tablouri în lucrul cu variabilele dintr-un formular

În Modulul 2 a fost prezentatã noþiunea de tablou, un tip de variabilã special, care poate avea mai multe valori asociate. In cadrul acestui modul, veþi învãþa mai multe despre utilizarea tablourilor.

<titlu>Crearea tablourilor</titlu>
Puteþi crea un tablou PHP în douã moduri principale. Puteþi atribui o valoare unei variabile dintr-un tablou sau puteþi invoca funcþia array(). În aceastã secþiune vor fi explicate ambele metode de creare a unui tablou.

<titlu>Crearea unui tablou folosind atribuiri</titlu>
Modalitatea cea mai simplã de a crea un tablou este de a atribui o valoare unei variabile de tip tablou. Iatã un exemplu simplu în acest sens:
$limbaje[] = „Perl”;
$limbaje[] = „PHP”;
$limbaje[] =”Python”;

Parantezele drepte care urmeazã dupã numele variabilei indicã limbajului PHP cã variabila $limbaje este o variabilã de tip tablou. PHP stocheazã în mod automat valorile atribuite tabloului în celule numerotate succesiv, începând de la $limbaje[0]. Iatã conþinutul tabloului, aºa cum rezultã din cele trei instrucþiuni de atribuire:

0 => Perl
1 => PHP
2 => Python

Simbolul => aratã cã unei valori îi este asociatã o cheie, în acest caz, cheia 0 este asociatã cu valoarea "Perl", cheia 1 este asociatã cu valoarea "PHP", iar cheia 2 este asociatã cu valoarea "Python". Puteþi asimila tabloul cu un tabel, caz în care exem­plul anterior este reprezentat astfel:

124

0 Perl
1 PHP
2 Python

Dacã doriþi, puteþi scrie o instrucþiune de atribuire care specificã o valoare cheie, astfel încât sã puteþi asocia o valoare cu un anumit element al tabloului. Sã luãm în considerare urmãtorul exemplu:

$limbaje[0] = „Perl”;
$limbaje[1] = „PHP”;
$limbaje[] =”Python”;

Observaþi cã instrucþiunea finalã de atribuire nu include nici o valoare de index. PHP asociazã valoarea "Python" cu urmãtorul element consecutiv al tabloului:

0 => Perl
1 => PHP
2 => Python

Elementele unui tablou nu trebuie asociate unor chei consecutive. Iatã un exemplu care demonstreazã acest fapt:

$limbaje[10] = „Perl”;
$limbaje[20] = „PHP”;
$limbaje[] =”Python”;

Aceste instrucþiuni de atribuire determinã urmãtorul conþinut al tabloului:

10 => Perl
20 => PHP
21 => Python

Remarcaþi, similar cu exemplul anterior, cã valoarea " Python” este asociatã urmã­torului element consecutiv din tablou.
Aºa cum s-a explicat în Modulul 2, PHP nu vã obligã sã folosiþi numere întregi pe post de chei. Puteþi crea un tablou asociativ, cunoscut ºi sub numele de tablou indexat cu ºiruri, prin specificarea drept chei a unor ºiruri:

$limbaje[PHP] = „Ridicat”;
$limbaje[Python] = „Mediu”;
$limbaje[Perl] =”Redus”;

Prin instrucþiunile de mai sus, urmãtoarele chei au fost atribuite urmãtoarelor valori:

PHP => Ridicat
Python => Mediu
Perl=>Redus

Semnificaþia utilizãrii pe post de chei a unor valori întregi consecutive este aceea cã puteþi folosi o buclã for simplã pentru a parcurge iterativ tabloul, cu alte cuvinte, pentru a examina valorile fiecãruia dintre elementele sale. Veþi învãþa mai multe despre parcurgerea iterativã a tablourilor în secþiunea urmãtoare, intitulatã „Utili­zarea funcþiei array()".

125

<titlu>Utilizarea funcþiei array()</titlu>
Dincolo de utilizarea instrucþiunilor de atribuire, cealaltã modalitate principalã de creare a unui tablou PHP constã în utilizarea funcþiei array(). Iatã un exemplu simplu, care creeazã un tablou având drept chei valori întregi consecutive:

$limbaje = array(„Perl”, „PHP”, „Python”);

Aceastã instrucþiune creeazã un tablou care conþine urmãtoarele asocieri:

0 => Perl
1 => PHP
2 => Python

Dacã doriþi sã asociaþi unei valori o anumitã cheie, puteþi folosi operatorul =>,
astfel:

$limbaje = array(10=>„Perl”, „PHP”, „Python”);

Aceastã instrucþiune creeazã urmãtorul tablou:
10 => Perl
11 => PHP
12 => Python

Ca ºi în cazul utilizãrii unei instrucþiuni de atribuire pentru crearea unui tablou valorile cheilor nu trebuie sã fie consecutive ºi nici mãcar întregi:

$limbaje = array(„PHP”=>„Ridicat”,”Python” =>„Mediu”, ”Perl”=>”Redus”);

Aceastã instrucþiune creeazã urmãtorul tablou:

PHP => Ridicat
Python => Mediu
Perl=>Redus

<Sfatul specialistului >
Întrebare: În cadrul altor limbaje de programare, este posibilã crearea de tablouri multi-dimensionale. Se poate proceda astfel ºi în PHP?
Rãspuns: Un tablou multi-dimensional poate fi asimilat, pur ºi simplu, unui tablou ale cãrui celule conþin valori ale unui tablou; cu alte cuvinte, un tablou de tablouri. De exemplu, sã presupunem cã doriþi sã caracterizaþi uºurinþa de învãþare ºi popularitatea mai multor limbaje de scripting. Puteþi reprezenta datele într-un tabel, în urmãtoarea formã:

<tabel>
*Limbaj
*Uºurinþã în învãþare
*Popularitate

*PHP
*simplu
*popular

*Python
*simplu
*nepopular

*Perl
*dificil
*popular

126

Puteþi reprezenta aceste date sub forma unui tablou PHP denumit $date, prin scrierea urmãtoarelor instrucþiuni:

$date["PHP"] = array("simplu", "popular");
$date["Python"] = array("simplu", "nepopular");
$date["PHP"] = array("dificil", "popular");

Sau puteþi scrie urmãtoarea instrucþiune:

$date = array("PHP"=>array(„simplu", "popular") ,
"Python"=>array("simplu","nepopular"),
"PHP"=>array("dificil", "popular"));
</sfatul specialistului>

<Test „la minut">
• Scrieþi instrucþiuni de atribuire PHP care atribuie numele principalelor culori aditive (roºu, verde ºi albastru) unor chei numerotate consecutiv ale unui tablou denumit $culoare.
• Scrieþi instrucþiuni de atribuire PHP care asociazã valorile 100, 1000 ºi 1000000 cheilor "suta", "mie" ºi "„milion" în cadrul unui tablou denumit $marime. </Test „la minut">

<titlu>Parcurgerea iterativã a unui tablou</titlu>
Când aþi stocat date într-un tablou, puteþi obþine acces la valoarea unui element al tabloului sau îi puteþi modifica valoarea prin intermediul cheii asociate elemen­tului. De exemplu, sã presupunem cã folosiþi urmãtoarele instrucþiuni pentru a crea un tablou:

$x[0] = 1;
$x[1] = 10;
$x[2] = 1000;

Puteþi obþine acces la valoarea asociatã cheii l prin intermediul unei instrucþiuni
ca aceasta:

$y = 3 * $x[1];

Similar, puteþi modifica valoarea asociatã cheii 2 prin intermediul unei instrucþiunu ca aceasta:

$x[2] = 100

<notã>
Rãspunsuri la test:
• $culoare[] = "roºu";
$culoare[] = "verde";
$culoare[] = "albastru";
•$marime["suta"] = 100;
$marime["mie"] = 1000;
$marime["milion"] = 1000000;</notã>

127

Uneori, în loc de a obþine accesul la un singur element al unui tablou sau de a-l modifica, doriþi sã obþineþi accesul la mai multe elemente ale tabloului. De exemplu, sã presupunem cã doriþi sã determinaþi dacã în tablou existã o anumitã cheie sau valoare. Sau sã presupunem cã tabloul reprezintã salarii ºi doriþi sã mãriþi fiecare valoare cu 10 procente. Operaþii de acest gen implicã parcurgerea iterativã a tablou­lui sau, altfel spus, accesul la fiecare element al tabloului. Aceastã secþiune explicã modul de iteraþie prin tablouri secvenþiale ºi non-secvenþiale.

<titlu>Parcurgerea iterativã a unui tablou secvenþial</titlu>
Un tablou ale cãrui chei sunt valori întregi consecutive se numeºte tablou secven­þial. În general, valoarea cea mai micã a unei chei dintr-un tablou secvenþial este zero; totuºi, puteþi crea un tablou secvenþial folosind valoarea unu sau orice altã valoare întreagã ca valoare minimã a cheii.
În cazul în care cunoaºteþi valoarea minimã a cheii unui tablou secvenþial, puteþi parcurge iterativ tabloul folosind o buclã for. Pentru aceasta, iniþializaþi variabila de buclã la valoarea cea mai redusã a cheii. Folosiþi funcþia count () pentru a forma expresia de test a buclei. Funcþia count () returneazã numãrul elementelor dintr-un tablou. Iatã un exemplu simplu de iteraþie într-un tablou:

$limbaje = array(0=>”Perl”, 1=>”PHP”, 2 =>”Python”);
$limita = count($limbaje);
for ($i = 0; $i < $limita; $i++)
{
echo <BR>$i => $limbaje[i]”;
}

Prima instrucþiune creeazã tabloul. Cea de-a doua instrucþiune obþine numãrul elementelor din tablou. Instrucþiunea for foloseºte variabila buclã $i pentru a parcurge iterativ tabloul; corpul instrucþiunii include o instrucþiune echo care afiºeazã cheia ºi valoarea fiecãrui element din tablou. Datele de ieºire se prezintã astfel:

0 => Perl
1 => PHP
2 => Python

<titlu>Cãutarea într-un tablou secvenþial</titlu>
Pentru a examina modul de utilizare a iteraþiilor, sã ne concentrãm asupra problemei de a determina dacã un tablou conþine o anumitã valoare. Iatã 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++)
{
echo „ <BR> Determinarea unei identitati cu $limbaje[$i];

128

if (cauta == $limbaje[$i])
{
„<BR>$cauta este un limbaj aprobat.”;
}
}

Prima instrucþiune creeazã tabloul în care se va cãuta. Desigur, într-o aplicaþie iterativã realã, tabloul nu va fi iniþializat cu valori literale imediat anterior operaþiei de cãutare, într-o aplicaþie realã, conþinutul tabloului este supus la variaþii.
Cea de-a doua instrucþiune atribuie valoarea "PHP" variabilei $cauta; în exemplu, se cautã în tablou valoarea stocatã în variabila $cauta. Dupã comentariu, urmãtoarea instrucþiune obþine numãrul elementelor din tablou ºi stocheazã aceastã valoare în variabila $limita. Instrucþiunea for funcþioneazã ca mai înainte; de data aceasta însã, corpul sãu conþine alte instrucþiuni ºi se executã o altã operaþie. O instrucþiune echo afiºeazã valoarea fiecãrui element al tabloului pe mãsurã ce iteraþia avanseazã. Instrucþiunea if testeazã fiecare element ºi afiºeazã un mesaj dacã valoarea elemen­tului este una ºi aceeaºi cu valoarea variabilei $cauta. Iatã rezultatul rulãrii exemplului:

Determinarea unei identitati cu Perl
Determinarea unei identitati cu PHP
PHP este un limbaj aprobat.
Determinarea unei identitati cu Python

<titlu>Instrucþiunea break</titlu>
Observaþi cã iteraþia continuã chiar ºi dupã stabilirea unei identitãþi. Când se cautã într-un tablou, execuþia cãutãrii poate fi sistatã dupã gãsirea elementului dorit; continuarea iteraþiei în tablou nu face decât sã iroseascã resursele calculatorului, farã a afecta rezultatele operaþiei. Pentru a opri execuþia unei iteraþii, puteþi folosi instructiunea break, care determinã încheierea imediatã a buclei care o conþine. Iatã cum se poate revizui exemplul anterior, astfel încât sã includã o instrucþiune break:

for ($i = 0; $i < $limita ; $i++
{
echo „<BR>Determinarea unei identitati cu $limbaje[$i]”;
if ($cauta == $limbaje[$i])
{
„<BR>$cauta este un limbaj aprobat.”;
break;
}
}
Acum, dupã stabilirea unei identitãþi, instrucþiunea break provoacã sistarea buclei for. Iatã datele de ieºire rezultate, care acum omit examinarea inutilã a elementului tabloului asociat cu limbajul "Python":

Determinarea unei identitati cu Perl
Determinarea unei identitati cu PHP
PHP este un limbaj aprobat.

129

<titlu>Instrucþiunea continue</titlu>
O instrucþiune corelatã cu instructiunea break este continue. Instrucþiunea continue sisteazã iteraþia curentã a buclei, determinând evaluarea imediatã a expre­siilor de incrementare ºi de test. Ca un exemplu, sã presupunem cã doriþi sã cãutaþi în tabloul $limbaje pentru a determina numãrul limbajelor care au nume scurte, adicã nume alcãtuite din maximum patru caractere. Iatã un exemplu care executã aceastã 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++)
{
$n = strlen($limbaje[$i]);
echo „<BR>$limbaje[$i] are $n caractere lungime.”;
if ($n4> 4) continue;
$scurt++;
}
echo „<BR>Au fost gasite $scurt limbaje cu nume scurte.”;

O instrucþiune de atribuire stabileºte valoarea iniþialã a variabilei $scurt, folositã pentru a numãra numele scurte gãsite, la zero. Instrucþiunea for se aseamãnã celor folosite anterior. Corpul acestei instrucþiuni diferã, desigur, de cele folosite anterior. Valoarea variabilei $n este stabilitã ca fiind egalã cu numãrul caracterelor care compun numele limbajului, folosind funcþia strlen(), care calculeazã lungimea unui ºir. Dacã instructiunea if stabileºte cã elementul curent al tabloului face referire la un limbaj cu nume lung, se executã instructiunea continue. Instructiunea continue determinã trecerea iteraþiei la urmãtorul element din tablou; dacã nu au mai rãmas elemente în tablou, bucla for îºi încheie execuþia. La finalizarea iteraþiei, o instruc­þiune echo afiºeazã numãrul numelor scurte de limbaje gãsite în tablou. Iatã 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 iterativã a unui tablou non-secvenþial</titlu>
În unele limbaje de programare, parcurgerea unui tablou non-secvenþial este o operaþie complicatã. Cu toate acestea, PHP 4 include o instrucþiune foreach care simplificã iteraþiile de acest gen. Instrucþiunea foreach are urmãtoarea formã generalã:

foreach (tablou as $cheie =>$valoare) {corp}

Instrucþiunea parcurge în mod iterativ tabloul denumit {tablou, stabilind valori adecvate pentru valorile variabilelor $cheie ºi $valoare aferente fiecãrui element al tabloului. Iatã un exemplu simplu:

130

$limbaje = array(10=>”Perl”, 20=>”PHP”, 21=>”Python”);
// parcurge iterativ tabloul
foreach ($limbaje as $index => $limbaj)
{
echo „<BR>$index =>$limbaj”;
}

Remarcaþi cã instrucþiunea echo face pur ºi simplu referire la valorile variabilelor $index ºi $limbaj, cãrora li se atribuie în mod automat valorile cheii, respectiv elementului curent. Iatã datele de ieºire ale exemplului:

10 =>Perl
20 =>HP
21 =>Pynton

<Sfatul specialistului>
Întrebare: Cum pot parcurge în mod iterativ un tablou multi-dimensional?
Rãspuns: Pentru a rãspunde la aceastã întrebare, sã parcurgem iterativ un tablou multi-dimensional care conþine urmãtoarele date:

<tablou>
*Limbaj
*Uºurinþã în învãþare
*Popularitate

*PHP
*simplu
*popular

* Python
*simplu
*nepopular

* Perl
* dificil
*popular
</tablou>

Tabloul poate fi creat folosind urmãtoarele instrucþiuni PHP:
$date["PHP"] = array(simplu", "popular");
$date["Python"] = array("simplu", "nepopular");
$date["PHP"]= array("dificil", "popular");

Pentru a parcurge tabloul în mod iterativ, folosiþi instrucþiuni foreach imbri­cate:

foreach ($date as $limbaj => $valoare)
{
foreach($valoare as $cheie =>$caracteristica)
{
echo „<BR>$limbaj:$caracteristica”;
}
}

Instrucþiunea foreach exterioarã obþine tabloul asociat cu fiecare limbaj; instrucþiunea foreach interioarã parcurge iterativ caracteristicile limbajului. Iatã rezultatul:

PHP: simplu
PHP: popular
Python: simplu
Python: nepopular
Perl: dificil
Perl: popular </Sfatul specialistului>

131

<Test „la minut">
• Care este instrucþiunea folositã pentru a parcurge în mod iterativ un tablou non-secvenþial?
• Care este funcþia ce returneazã numãrul elementelor dintr-un tablou?
• Care este instrucþiunea folositã pentru a sista iteraþia curentã a unei bucle?
• Care este instrucþiunea folositã pentru terminarea imediatã a unei bucle?
</Test „la minut">

<titlu>Lucrul cu funcþii listã</titlu>
În afarã de modalitãþile de parcurgere iterativã a tablourilor, PHP oferã numeroase funcþii care vã permit traversarea tablourilor, deplasându-vã înainte sau înapoi, dupã dorinþã. Prima dintre aceste funcþii este current(), care returneazã valoarea curent al tabloului. Funcþia current() foloseºte un pointer intern de tablou pe care PHP îl creeazã pentru fiecare tablou. Când creaþi un tablou, pointerul intern de tablou este configurat astfel încât sã facã referire la primul element al tabloului. Funcþiile next() ºi prev() modificã pointerul intern al tabloului ºi se pot folosi alãturi de funcþia current() pentru a parcurge un tablou. Funcþia next(), aºa cum îi aratã ºi numele*, modificã pointerul intern al tabloului astfel încât acesta sã facã referire la urmãtorul element, în timp ce funcþia prev() modificã pointerul intern al tabloului astfel încât acesta sã facã referire la elementul anterior.
Iatã un exemplu care prezintã modul de operare al funcþiilor menþionate:

$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”;

Iatã datele de ieºire ale exemplului:

functia current() a returnat Perl
functia next() a returnat PHP
functia next() a returnat Python
functia prev() a returnat PHP

Observaþi modul în care sunt utilizate funcþiile prev() ºi next() pentru deplasarea înapoi, respectiv înainte, în interiorul tabloului.
<notã>
Rãspunsuri la test:
• foreach
• count()
• continue
• break
*In limba englezã next— urmãtor. (N.T.)</notã>

132

<titlu> Funcþia key () </titlu>
Funcþia key() este corelatã cu funcþia current(). Dacã funcþia current() retur­neazã valoarea asociatã elementului curent, funcþia key () returneazã cheia asociatã elementului curent. Iatã un exemplu care ilustreazã modul de operare al acestei funcþii:

$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 ieºire ale exemplului sunt urmãtoarele:

functia current() a returnat Perl
functia key() a returnat 10

<titlu>Funcþia each()</titlu>
O altã funcþie utilã în parcurgerea tablourilor este each (). Funcþia each () returneazã urmãtoarea pereche cheie-valoare din tabloul specificat. Perechea cheie-valoare este returnatã sub forma unui tablou asociativ cu patru elemente, dupã cum urmeazã:

<tabel>
*Cheie
*Valoare

*0
*Componenta cheie a perechii cheie-valoare curentã

*1
* Componenta valoare a perechii cheie-valoare curentã

*"key"
* Componenta cheie a perechii cheie-valoare curentã

*"value"
* Componenta valoare a perechii cheie-valoare curentã
</tabel>

Observaþi cã puteþi folosi valoarea cheie „0" sau „cheie" pentru a obþine accesul la componenta cheie a perechii cheie-valoare; similar, puteþi folosi valoarea cheie „1" sau „valoare" pentru a obþine accesul la componenta valoare a perechii cheie-valoare. Iatã un scurt exemplu care ilustreazã modul de operare a funcþiei each ():

$limbaje = array(10=>”Perl”, 20=>”PHP”, 21=>”Python”);
$fiecare = each($limbaje);
$zero = $each[1];
$cheie = each[‚key’];
$valoare = $each[‚value’];
echo „<BR>zero=$zero”;
echo „<BR>unu=$unu”;
echo „<BR>cheie=$cheie”;
echo „<BR>valoare=$valoare”;

Datele de ieºire ale acestui exemplu sunt urmãtoarele:
zero=10
unu=Perl
cheie=10
valoare=Perl
133

<titlu>Funcþia list()</titlu>
O altã funcþie utilã în lucrul cu tablouri este funcþia list(), care vã permite sã atribuiþi valori la numeroase variabile în cadrul unei instrucþiuni. Funcþia list() este deseori folositã cu funcþia each(), deoarece funcþia list() faciliteazã accesul separat la cheia ºi la valoarea returnate de funcþia each (). Forma generalã de utilizare a funcþiei list() este urmãtoarea:

list($var1,$var2,…,$varn)=valoare_tablou;

Fiecare dintre variabilele specificate, de la $var1 la $varn, primeºte o valoare din tabloul valoare_tablou. Într-un fel, funcþia list() este opusã funcþiei array(), deoarece funcþia list () împarte un tablou într-o serie de valori scalare, în timp ce funcþia array() construieºte un tablou dintr-o serie de valori scalare.
Iatã un exemplu care ilustreazã modul de utilizare a funcþiei 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, iatã datele de ieºire ale exemplului:

cheie =10, valoare = Perl
urmator = Python

<Test „la minut">
• Care este funcþia ce vã permite sã atribuiþi valori mai multor variabile simultan?
• Care este funcþia ce returneazã componenta cheie a unei perechi cheie-valoare asociatã elementului curent al tabloului?
• Care este funcþia ce mãreºte valoarea unui pointer intern de tablou?</test la minut>

<Sfatul specialistului>
Întrebare: PHP mai conþine ºi alte funcþii pentru lucrul cu tablourile?
Rãspuns: Da. PHP conþine peste 40 de funcþii pentru lucrul cu tablourile, cu mult mai multe decât pot fi descrise în acest capitol. De exemplu, funcþia array_search() faciliteazã cãutarea într-un tablou. Pentru informaþii despre aceastã funcþie ºi despre alte funcþii utilizate în lucrul cu tablouri, examinaþi documentaþia PHP în variantã electronicã, la adresa http://www.php.net.
</sfatul specialistului>

<notã>
Rãspunsuri la test:
list()
key()
next()

134

<titlu>Sortarea tablourilor</titlu>

Sortarea reprezintã o altã operaþie frecvent aplicatã tablourilor. PHP furnizeazã o suitã de funcþii care faciliteazã sortarea unui tablou. De exemplu, un tablou poate fi creat dupã cum urmeazã:

$limbaje = array(10=>”Perl”, 20=>”PHP”, 21 =>”Python”);

Apoi, doriþi sã sortaþi tabloul în funcþie de numele limbajului de programare. Pentru aceasta, pur ºi simplu invocaþi funcþia sort():

Sort($limbaje);

Dupã sortare, conþinutul tabloului apare aºa cum se poate vedea mai jos:

0 => PHP
1 =>Perl
2 =>Python

Observaþi cã secvenþa de sortare sau secvenþa de aranjare (cum este numitã uneori) este sensibilã la diferenþa între majuscule ºi minuscule. Deoarece litera H mare este sortatã anterior literei e mic, PHP apare înainte de Python în datele de ieºire sortate.
Tabelul 8-1 prezintã pe scurt funcþiile de sortare ale limbajului PHP, inclusiv rezultatul aplicãrii fiecãrei funcþii tabloului folosit în exemplul anterior.

<tabel 8-1 Un sumar al funcþiilor de sortare ale limbajului PHP>
*Operaþie
*Funcþie
*Rezultat

*Sortarea unui tablou în funcþie de valoare
*sort()
*0 => PHP
1 =>Perl
2 => Python

*Sortarea unui tablou asociativ în funcþie de valoare
*asort()
*20 => PHP
10 => Perl
21 => Python |

*Sortarea unui tablou dupã valoare, în ordine descendentã
*rsort()
*0 => Python
1 => Perl
2 => PHP

*Sortarea unui tablou asociativ dupã valoare, în ordine descendentã
*Arsort()
*21 => Python
10 => Perl
20 => PHP

*Sortarea unui tablou sau a unui tablou asociativ în funcþie de cheie
*ksort()
*10 => Perl
20 => PHP
21 => Python

*Sortarea unui tablou sau a unui tablou asociativ în funcþie de cheie, în ordine descendentã
*Krsort()
*21 => Python
20 => PHP
10 => Perl
</tabel 8-1>

135

<Sfatul specialistului>
Întrebare: Sã presupunem cã doresc sã execut o cãutare fãrã sensibilitate la diferenþa între majuscule ºi minuscule. Cum pot proceda?
Rãspuns: O modalitate ar fi utilizarea funcþiei natcasesort(), care sorteazã un tablou folosind o „ordine naturalã", care nu este sensibilã la diferenþa între majuscule ºi minuscule. O altã modalitate constã în a utiliza funcþia usort() sau una dintre funcþiile sale conexe , în speþã uksort() ºi uasort(). Aceste funcþii vã permit sã definiþi o secvenþã de aranjare personalizatã, pe care o specificaþi prin desemnarea unei funcþii care comparã valorile în conformitate cu secvenþa de aranjare. Funcþia usort() sorteazã valorile din tablou ºi returneazã un tablou secvenþial; funcþia uksort() sorteazã cheile tabloului, iar funcþia uasort() sorteazã un tablou asociativ.
De exemplu, urmãtoarele instrucþiuni creeazã un tablou ºi îl sorteazã într-o manierã insensibilã la diferenþa între majuscule ºi minuscule:
$limbaje = array("Perl", "PHP", "Python");
usort($limbaje, "strcmpcase");

Funcþia strcmpcase() este o funcþie din biblioteca PHP care comparã douã ºiruri fãrã a tine cont de mãrimea literelor (majuscule sau minuscule). Funcþia returneazã o valoare negativã dacã primul ºir este mai mic decât al doilea, zero dacã ºirurile sunt identice, respectiv o valoare pozitivã dacã primul ºir este mai mare decât al doilea.
Puteþi implementa o secvenþã de aranjare personalizatã scriind propria dumneavoastrã funcþie ºi specificând numele acesteia ca argument al funcþiei usort() sau al uneia din funcþiile sale conexe. Pur ºi simplu scrieþi o funcþie care preia douã argumente ºir ºi returneazã -l, 0 sau +1, în funcþie de rezultatul compa­raþiei între valorile ºir.
Pentru mai multe informãþii despre funcþia usort() ºi despre funcþiile sale conexe, examinaþi documentaþia în variantã electronicã, la adresa http://www.php.net.
</sfatul specialistului>

<Test „la minut">
• Care este funcþia ce trebuie folositã pentru a sorta un tablou asociativ în ordine descrescãtoare?
• Care este funcþia ce trebuie folositã pentru a sorta un tablou în ordine ascendentã, în funcþie de valoarea cheii? </Test „la minut">

<notã>
Rãspunsuri la test:
• arsort()
• ksort()
</notã>

136

<titlu>Proiect 8-1: O reluare a formularului cu persoane de contact</titlu>
În cadrul acestui proiect, veþi vedea un exemplu simplu care include parcurgerea iterativã a tablourilor ºi sortarea acestora. Proiectul foloseºte sistemul de contact prin e-mail utilizat în proiectele anterioare. Formularul de contact prin e-mail furnizeazã spaþiu pentru introducerea numelor copiilor persoanei de contact. Acest proiect prezintã modul de sortare a numelor în ordine alfabeticã ºi modul de afiºare a numelor respective.

<titlu>Scopurile proiectului</titlu>
• Prezentarea modului de utilizare a unui tablou ca variabilã de formular
• Prezentarea modului de parcurgere iterativã a unui tablou
• Prezentarea modului de sortare a unui tablou

<titlu>Pas cu pas</titlu>
1. Plasaþi urmãtorul script PHP într-un fiºier denumit p-8-1 .php ºi încãrcaþi acest fiºier în serverul dumneavoastrã PHP:

<?php
foreach ($copil as $index => $copil)
{
echo "<BR>copil[$index]=$copil";
}
echo "<BR>";

sort($copii);

foreach ($copii as $index => $copil)
{
echo "<BR>copil[$index]=$copil";
}
?>

2. Plasaþi urmãtorul text HTML într-un fiºier denumit p-8-1 .html ºi încãrcaþi acest fiºier în serverul dumneavoastrã, plasându-l în acelaºi catalog ca ºi fiºierul 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=”copii[]”></TD>
</TR>
<TR>
<TD><INPUT TYPE=”TEXT” NAME=”copii[]”></TD>
</TR>

137

<TR>
<TD><INPUT TYPE=”TEXT” NAME=”copii[]”></TD>
</TR>
<TR>
<TD><INPUT TYPE=”TEXT” NAME=”copii[]”></TD>
</TR>
<TR>
<TD><INPUT TYPE=”TEXT” NAME=”copii[]”></TD>
</TR>
</TABLE>
<BR>
<BR>
<BR>
<INPUT TYPE=”SUBMIT” VALUE=”Trimite”>
<BR>
<BR>
<INPUT TYPE=”RESET” VALUE=”Sterge datele”>
</FORM>
</BODY>
</HTML>

3. Alocaþi un timp studiului paginii HTML. Casetele text sunt nume care fac referire la o variabilã de tip tablou PHP. De asemenea, parcurgeþi scriptul PHP, studiind modul de funcþionare a iteraþiei care afiºeazã numele copiilor.
4. Orientaþi un browser Web spre adresa URL a fiºierului HTML încãrcat anterior. Ecranul browserului trebuie sã fie asemãnãtor celui prezentat în continuare. Introduceþi valori pentru numele copiilor ºi apoi executaþi clic pe butonul „Trimite".
5. La execuþia scriptului, acesta afiºeazã numele copiilor în ordinea în care au fost introduse. Apoi, numele sunt sortate ºi afiºate în ordine sortatã. Un rezultat caracteristic al operaþiei de sortare este prezentat în continuare.

<ecran>
Contact Information
<câmpuri>
Childrens Names:
Able
Charley
Baker
Edward
Delta
</câmpuri>
<buton> submit</buton>
<buton> Clear the form </buton>
</ecran>

<ecran>
child[0]=able
child[1]=charley
child[2]=baker
child[3]=edward
child[4]=delta

child[0]=able
child[1]=charley
child[2]=baker
child[3]=edward
child[4]=delta
</ecran>

138

<Test de evaluare>
1. Scrieþi instrucþiuni care creeazã un tablou denumit $pop, care asociazã numele mai multor oraºe mari cu numãrul locuitorilor acestora.
2. Scrieþi o instrucþiune for care parcurge în mod iterativ un tablou secvenþial denumit $pitici, unde cheia minimã are valoarea unu. Corpul instrucþiunii for trebuie sã afiºeze numele fiecãrui element al tabloului $pitici. Aveþi grijã la scrierea expresiei de test, care trebuie sã reflecte faptul cã valoarea cea mai micã a unei chei este unu, nu zero.
3. Scrieþi o instrucþiune foreach care cautã în tabloul $state un element a cãrui cheie are aceeaºi valoare ca ºi variabila $abrev. Afiºaþi valoarea elementului corespunzãtor, nu cheia acestuia.
4. Scrieþi o instrucþiune care sorteazã tabloul asociativ $pop în ordine crescãtoare, în funcþie de valoare.</Test de evaluare>

Visits: 399
   
 Top


Advertise on our site! Click here

 powered by Peperoni.de Users online right now: 13434   Help/FAQ   Terms   Imprint