Se afișează postările cu eticheta PHP. Afișați toate postările
Se afișează postările cu eticheta PHP. Afișați toate postările

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)