vineri, 20 decembrie 2013

Utilizarea vectorilor în PHP (sau Care este prețul ascuns al libertății?)


PHP (PHP: Hypertext Preprocessor) este un limbaj slab tipizat. Mai mult, interpretatorul PHP nici nu suportă specificarea tipului la declararea variabilelor. Acest fapt oferă programatorului libertatea de a „jongla” cu tipurile datelor în funcție de necesități, lăsînd pe seama interpretatorului recunoașterea tipului variabilelor. Dar „Libertatea înseamnă răspundere...”[1]. O situație de care m-am „poticnit” recent demostrează acest lucru.

[Ne]cazul cu vectorii

La prima vedere s-ar părea că în PHP vectorii sînt de două feluri: vectori obișnuiți (structuri liniare în memorie) și vectori asociativi (perechi de chei și valori). Fals! În PHP orice vector este vector asociativ ordonat. Acest fapt generează o mulțime de avantaje (flexibilitate și spațiu de manevră limitat doar de fantezia programatorului), dar... cere mai multă atenție, responsabilitate...

Fie un vector, indexat numeric, doar că că construit nu într-o ordine nefirească.
<?php
$a = array();
$a[1] = 'Valoarea1';
$a[2] = 'Valoarea2';
$a[0] = 'Valoarea0';
 
afiseaza_tablou($a);
?>

Știind că funcția afiseaza_tablou parcurge vectorul și sfișează fiecare element;  ce va afișa funcția? Mai exact, mă intereseaza ordinea în care vor fi afișate elemntele.

Răspuns: depinde de tipul structurii repetitive utilizate pentru parcurgerea vectorului. Fară a pierde din generalitate putem evidenția două cazuri:

(1) Este folosită structura for(;;); de exemplu:

<?php
function afisare_tablou($tablou) {
 for($i=0; $i<count($tablou); $i++)
  echo "a[$i]=$a[$i]\n";
}
?>

Atunci rezultatul afișarii va fi:

a[0]='Valoarea0'
a[1]='Valoarea1'
a[2]='Valoarea2'

(2) Dacă însă este folosită structura foreach ( as ) (de care m-am molipsit de cînd programam în Java); de exemplu:

<?php
function afisare_tablou($tablou) { 
 foreach($tablou as $i=>$v) 
 echo "a[$i]=$v\n"; }
?>
Atunci se va afișa:

a[1]='Valoarea1'
a[2]='Valoarea2'
a[0]='Valoarea0'

Ordinea afișarii este diferită. Deoarece vectorii sînt întotdeauna ordonați, iar valoarea cu indexul 0 a fost adăugată în ultimul rînd.

Soulții.

(1) Specificarea numarului de elemente ale vectorului.

<?php
$a = array(3);
?>

(2) Reindexarea vectorului folosind funcția array_values.


<?php
$a = array_values($a);
?>

(3) Sortarea vectorului folosind  funcția ksort.

<?php
ksort($a);
?>

[1] „Libertatea înseamnă răspundere, de aceea majoritatea oamenilor se tem de ea.” (Bernard Shaw)

Niciun comentariu:

Trimiteți un comentariu