Citeam zilele tecute pe The PHP Benchmark un articol  care compară diversele metode prin care se poate parcurge un vector asociativ. În mod normal, un foreach simplu care ne-ar funriza cheia şi valoarea aflată la cel index ar fi de ajuns la fel şi soluţia unui for cu indice de la zero la numarul maxim de elemente, în cazul în care cheile vectorului ar fi numere întregi. Cu toate acestea însă, în cazul unui volum mare de date utilizarea unui foreach, uşoară şi comodă, poate duce la un timp de execuţie foarte mare


reset($aHash);
foreach($aHash as $key => $val)
{
$aHash[$key] .= "a";
}

Exemplul de mai sus, are timp de executie 409 µs pe un vector de 100 de elemente.


$key = array_keys($aHash);
$size = sizeOf($key);
for ($i=0; $i<$size; $i++)
{
$aHash[$key[$i]] .= "a";
}

Deşi cel de-al 2-lea exemplu presupune mai multe opreaţii decât primul, timpul de execuţie în conditiile în care furnizăm acelaşi vector de 100 de elemente este de 38 µs ... de 10 ori mai putin.

Vectorii

Vectorii, numiţi in engleză array, reprezintă cea mai avansată metodă de stocare a datelor în PHP. Sunt cele mai flexibile structuri de date: ele permint indecşi numerici sau alfanumerici, dar şi combinaţii; pot avea indecşi auto-incrementabili şi pot fi folosiţi ca stive, cozi, mulţimi, vectori uni, bi sau multi-dimenisonali şi pot stoca practic orice tip de dată. Este şi motivul pentru care în nucleul php există aproximativ 70 de funcţii definite pentru a uşura lucrul cu vectorii.

Aşadar aceşti vectori sunt o colecţie ordonată de obiecte numite generic elemente. Oricare dintre aceste elemente are o cheie unică în vector precum şi o valoare. Vectorii pot fi creaţi in 2 feluri, fie apeland functia array simplu, sau cu parametrii caz în care aceştia sunt atribuiţi vectorului.

[code lang="php"]
$arr = array();
$arr = array('a' => 1, 'b' => 2, 'c' => 3);
$arr = array(1 => 'a', 2 => 'b', 3 => 'c');
$arr = array(1, 2, 3);
[/code]

Primul apel va crea un vector gol, cel de-al doilea un vector cu indecşi alfanumerici, al 3-lea cu indecşi numerici, iar pentru cel din urmă am furnizat doar valorile elementelor, pentru care indecşii de vor atribui automat prin autoincrementare.

Afisarea vectorilor

Spre deosebire de tipurile de date scalare(int, string, float) care pot fi afişate folosind funcţia echo, pentru vectori aceasta prezintă cateva neajunsuri la afişarea datelor. De exemplu, în timpul unui debug poate fi esenţial să avem informaţii nu doar despre datele aflate în elemnte, dar şi tipul lor de date, pe oricare din nivelele existente. Pentru a preîntâmpina această problemă PHP furnizează 2 funcţii de afişare recursivă a informaţiilor dintr-un array:
[code lang="php"]
$array = array(1, 2, 'foo');
print_r($array);
var_dump($array);
[/code]
Acest cod va produce următorul text:
[code]
Array
(
[0] => 1
[1] => 2
[2] => foo
)
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
string(3) "foo"
}
[/code]

Observaţi cum, deşi ambele afişează elementele vectorilor, doar var_dump afişează şi tipul de dată al elementului respectiv. Mai mult, doar var_dump este capabil sa afişeze informaţiile despre mai mult de o variabiă, iar print_r are capacitatea de a trimite rezultatul către o variabilă prin specificarea celui de-al doilea parametru optional.