Învăţăm PHP: Despre şiruri (funcţii)


După cum spuneam, PHP-ul este plin de funcţii. Aceasta ne uşurează mult munca. De exemplu avem un şir şi dorim să aflăm valoarea maximă: evident că, dacă avem ceva cunoştinţe de programare, putem să implementăm noi o funcţie, folosind diverşi algoritmi. Dar PHP oferă nativ o astfel de funcţie. Surpriză: îi spune simplu max(). De fapt această funcţie nu este strict specifică array-urilor. Putem să îi dăm ca parametru un array, o variabilă şir, dar putem şi să îi indicăm concret valorile (ex: echo max(3,1,5);). În replică există şi funcţia min(), ce merge şi ea pe array-uri. Vedem deci cum o sintaxă scurtă (ex: max($numere);) scuteşte un cod lung de câteva linii.

Trecem acum de primele trei linii (secvenţa 1) şi vedem următoarele trei linii (secvenţa 2) din codul de mai jos. Am definit un array cu câteva nume de copii. Să presupunem că vrem să tragem la sorţi, complet aleator, câştigătorul. Cum facem? Am putea folosi funcţia rand(), dar încă nu am povestit despre ea. Pentru şiruri PHP pune la dispoziţie array_rand(). Atenţie: aceasta nu returnează elementul din şir (ales aleator), ci indicele din şir (ales aleator). Mai frumos este că poţi alege aleator şi mai mulţi câştigători şi funcţia va avea grijă ca aceştia să fie diferiţi între ei. Pentru aceasta la array_rand() trebuie să îi indicăm suplimentar un parametru în care spunem câte elemente să fie alese aleator (dacă nu punem deduce că unul singur). Vreţi să vă convingeţi? Vedeţi în execuţie pagina de mai jos mergând aici şi nu uitaţi să daţi Refresh pentru a vă convinge că sunt alegeri aleatoare.

Ce face a treia secvenţă? Am definit şirul cifrelor după care cu apelul funcţiei array_reverse() le-am inversat. Da, inversarea unui şir se face dintr-o linie de cod! Amestecarea la fel, dintr-un apel al funcţiei shuffle(). În paranteză fie spus, dacă vă întrebaţi ce e cu parametru false la print_r, e pentru ca rezultatul să fie afişat frumos, la locul lui în acel echo.

[PHP]//secventa 1
$numere=array(15,34,18,3556,224,1356,1293,938,285,50203,237,1294);
echo ‘Maximul dintre numere este ‘.max($numere).’.
‘;
echo ‘Minimul dintre numere este ‘.min($numere).’.
‘;

//secventa 2
$copii=array(„Ionel”,”Maria”,”Viorel”,”Matei”,”Ana”,”Mariana”);
echo ‘Castigatorul ales aleator este (tobele va rog): ‘.$copii[array_rand($copii)].’.
‘;
echo ‘Mai mult copii (pozitiile lor): ‘.print_r(array_rand($copii,3),true).’.
‘;

//secventa 3
$cifre=array(0,1,2,3,4,5,6,7,8,9);
echo ‘Inversat: ‘.print_r(array_reverse($cifre),true).’.
‘;
shuffle($cifre);
echo ‘Amestecat: ‘.print_r($cifre,true).’.
‘;

//secventa 4
$interval=range(3,11);
echo ‘Valori interval: ‘.print_r($interval,true).’.
‘;
echo ‘Apartine 10? ‘.(in_array(10,$interval)?’da’:’nu’).’.
‘;
echo ‘Apartine 20? ‘.(in_array(20,$interval)?’da’:’nu’).’.
‘;

//secventa 5
$capitale=array(‘Franta’=>’Paris’,’Romania’=>’Bucuresti’,’Italia’=>’Roma’);
echo ‘Italia apare in lista? ‘.array_key_exists(‘Italia’,$capitale).’.
‘;
echo ‘Germania apare in lista? ‘.array_key_exists(‘Germania’,$capitale).’.
‘;
echo ‘Bucuresti apare in lista? ‘.in_array(‘Bucuresti’,$capitale).’.
‘;[/PHP]

În a patra secvenţă vedeţi cât de uşor se poate iniţializa un array dacă ştim că valorile sunt într-un interval, numere succesive. Am luat de exemplu numerele întregi de la 3 la 11 şi apoi, după afişarea şirului, am testat dacă 10 şi 20 fac parte din şir. Funcţia in_array este foarte, foarte, foarte utilă şi ar fi bine să o reţineţi. Dar ce ne facem dacă şirul nu este simplu ci asociativ? Nici o problemă: folosim array_key_exists(). Parcurgeţi cu atenţie secvenţa 5 de mai sus şi observaţi diferenţele în verificarea unei chei sau a unei valori din şir (Italia e cheie, Bucuresti e valoare).

Acum intrăm într-un teritoriu… cu cântec. Al sortărilor. De fapt problemele apar doar din neatenţie. Nu vă aşteptaţi la început să nu greşiţi :) , dar ar fi excelent să fiţi atenţi la cele de mai jos. Şi începem cu prima secvenţă, cea mai simplă. Vă amintiţi şirul de numere din codul de mai sus? L-am reluat. Acum vrem să îl sortăm crescător, apoi descrescător. Cum facem? PHP-ul pune la dispoziţie instrumentele necesare, adică funcţiile sort() şi rsort() (sort – crescător, rsort – reverse sort – descrescător). Ca de obicei vă puteţi convinge executând codul de mai jos cu un click aici.

[PHP]//secventa 1
$numere=array(15,34,18,3556,224,1356,1293,938,285,50203,237,1294);
sort($numere);
echo ‘

Sirul sortat crescator

‘;
foreach($numere as $numar)
echo $numar.’ ‘;
rsort($numere);
echo ‘

Sirul sortat decrescator

‘;
foreach($numere as $numar)
echo $numar.’ ‘;

//secventa 2
$capitale=array(‘Franta’=>’Paris’,’Romania’=>’Bucuresti’,’Italia’=>’Roma’);
echo ‘

Sirul original

‘;
foreach($capitale as $cheie=>$valoare)
echo ‘(‘.$cheie.’=>’.$valoare.’) ‘;
sort($capitale);
echo ‘

Sirul sortat cu sort

‘;
foreach($capitale as $cheie=>$valoare)
echo ‘(‘.$cheie.’=>’.$valoare.’) ‘;
$capitale=array(‘Franta’=>’Paris’,’Romania’=>’Bucuresti’,’Italia’=>’Roma’);
asort($capitale);
echo ‘

Sirul sortat cu asort

‘;
foreach($capitale as $cheie=>$valoare)
echo ‘(‘.$cheie.’=>’.$valoare.’) ‘;
$capitale=array(‘Franta’=>’Paris’,’Romania’=>’Bucuresti’,’Italia’=>’Roma’);
ksort($capitale);
echo ‘

Sirul sortat cu ksort

‘;
foreach($capitale as $cheie=>$valoare)
echo ‘(‘.$cheie.’=>’.$valoare.’) ‘;

//secventa 3
$cuvinte=array(‘alfabet’,’Axente’,’are’,’Abecedar’,’abac’);
sort($cuvinte);
echo ‘

Cuvintele sortate alfabetic cu sort

‘;
foreach($cuvinte as $cuvant)
echo $cuvant.’ ‘;
$cuvinte=array(‘alfabet’,’Axente’,’are’,’Abecedar’,’abac’);
natcasesort($cuvinte);
echo ‘

Cuvintele sortate alfabetic cu usort

‘;
foreach($cuvinte as $cuvant)
echo $cuvant.’ ‘;[/PHP]

Problemele apar la şirurile asociative. Vedeţi secvenţa 2? Vedeţi şirul cu capitalele? Dacă apelăm la sort e de rău: funcţia va sorta şi, aşa cum am învăţat de la început, va pune primul vagon după locomotivă cu numărul 0, apoi cu 1 ş.a.m.d. Pentru ca cheile (indecşii) să nu se piardă, vom folosi asort() (asociative sort), funcţia de sortare specială pentru array-uri asociative. După cum vedeţi rezultatul este cel aşteptat. Dar dacă nu dorim după valori sortarea, ci după chei? Nici o problemă: folosim ksort().

Şi acum a doua problemă: sensibilităţile la litere mici, litere mari. După cum vedeţi, tentaţia este din nou să folosim sort. Doar că pentru sort „Axente” este înainte de „abac” pentru că A este înainte de a. Dacă dorim sortarea să nu fie atât de „sensibilă” la majuscule/minuscule, putem folosi natcasesort(). Vă recomand să vedeţi din documentaţia PHP această pagină cu un tabel cu funcţiile de sortare, cu explicaţiile de rigoare (care ce face). Şi pentru că am vorbit mult, încheiem aici.


Apreciază articolul:

1 stea2 stea3 stea4 stea5 stea (Neevaluat încă)
Loading...Loading...

0 comentarii


Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *