Sono continuamente sorpreso dai programmatori in PHP che sostengono con le unghie e i denti che un “array” in PHP è un “array reale”. Questi stessi programmatori, che spesso programmano in almeno un altro linguaggio (JavaScript), sembrano confusi su quello che è un array e come dovrebbe funzionare. (Uno persino pensava a collezioni di classi in altre lingue come “l’abbondanza del inutile”, un chiaro sintomo di questo malinteso.) Per contro, i nuovi sviluppatori PHP che provengono da altri linguaggi sono spesso confusi dal fatto che gli array PHP non funzionano come previsto. Accadono cose strane per ordinare tali array. La confusione può essere chiarita a livello terminologico. Il semplice fatto è che gli array PHP non sono array in senso tradizionale del termine. Essi sono ordinati come tabelle hash. Mi spiego con alcuni esempi.
Spiegazione

Tra i tipi di dati predefiniti in PHP, vi è un largo uso del tipo chiamato array. È l’unico tipo di simil-collezione nativa. È costruita in questo modo: array(). E viene fornito con una vasta gamma di funzioni di supporto, come array_walk(), array_values(), array_diff() e array_combine().
Al valore nominale, la sintassi di un array è simile ad altre lingue:
Copia codice

<?php
// Creare un array e assegnare i primi due valori.
$foo = array();
$foo[0] = 'Primo slot';
$foo[1] = 'Secondo slot';
// Creare un array con cinque elementi,
// e poi scorrere la lista.
$bar = array(1, 2, 3, 4, 5);
for ($i = 0; $i < count($bar); ++$i) {
	// Uscita '12345'.
	print $bar[$i];
}
?>
Eppure, nonostante i suoi orpelli, un array in PHP non è affatto un array. Si tratta di una tabella hash ordinata (mappa hash ordinata che preserva il suo ordine nel dizionario). Per questo motivo, si possono fare cose come queste:
Copia codice

<?php
$foo = array();
$foo['a'] = 'Primo slot';
$foo['b'] = 'Secondo slot';
$foo['c'] = 'Terzo slot'; 
// Questo ritorna 'abc', perché l'ordine e preservato.
foreach ($foo as $key => $value) {
	print $key;
}
?>
Ho sentito persone che sostengono “No, sono entrambi! Ecco perché: Le chiavi possono essere interi o qualunque altro scalare. Quando sono interi, la struttura di dati funziona come un array“.
Questo non è esattamente vero. È vero che se si fornisce solo i valori, chiavi intere verranno assegnate automaticamente. Ed è vero che ci sono una grande varietà di scorciatoie per fare in modo che gli array in PHP si comportino come degli array. Ma non sono mai veri array a tutti gli effetti. (Né sono liste collegate o array di liste).
Ecco un semplice esempio che illustra questo caso:
Copia codice

<?php
$bar = array();
for($i = 7; $i >= 0; --$i) {
	$bar[$i] = $i;
}
// Stampa l'array come una stringa
// di valori separati da uno spazio
print implode(' ', $bar);
?>
Il ciclo precedente crea un array di otto elementi, assegnando loro una chiave intera. Tuttavia, assegna i valori in ordine inverso. Quale dovrebbe essere il contenuto finale dell’array (e quale il suo ordine)?
Se si trattasse di un vero array, la stringa finale dovrebbe stampare questo:
Copia codice

0 1 2 3 4 5 6 7
Infatti, stampa questo:
Copia codice

7 6 5 4 3 2 1 0
Perché? Perché questo non è un array. È una mappa hash ordinata. L’indice “reale” della lista di ordinamento è (apparentemente) inaccessibile a noi, ma assegna la coppia 7 => 7 alla prima (0) posizione, e la coppia 0 => 0 per l’ottava posizione (7). Scrivete lo stesso codice in JavaScript, Python, Ruby, Perl, Java o C# utilizzando gli array o le liste indicizzate e si ottiene il primo risultato: un elenco da 0 a 7.
Nel caso in cui credi di aver tirato fuori qualche strano caso al limite, ecco un altro esempio che crea un array e lo inizializza con dei valori, manca solo il valore per l’indice 4. Il quarto sarà aggiunto in seguito:
Copia codice

<php
$bar = array(0 => 'a',
			 1 => 'a',
			 2 => 'a',
			 3 => 'a',
			 5 => 'a',
			 6 => 'a',
			 7 => 'a'
			);
$bar[4] = 'b';
print implode(' ', $bar);
?>
Quello che ci si aspetterebbe quanto sopra per la stampa sarebbe:
Copia codice

'a a a a b a a a'
Invece, la stampa in realtà è
Copia codice

'a a a a a a a b'
Perché? Poiché la posizione dell’indice 4 è occupato dalla quinta, e quando abbiamo inserito $bar[4], in realtà è stato scalanato in ottava posizione. Anche se abbiamo ordinato le chiavi numericamente, questo è ancora una tabella hash.
La confusione tra l’array-atezza e il tipo array PHP può causare alcuni eccentrici bachi. Recentemente ho trovato del codice che effettivamente ha fatto questo:
Copia codice

<?php
$foo = array();
$foo[0] = 'Primo';
$foo[1] = 'Secondo';
$foo[2] = 'Terzo';
$foo[3] = 'Ultimo';
// In determinate condizioni, un elemento
// può  essere eliminato in questo modo:
unset($foo[1]);
// In altre condizioni, un elemento
// può  essere modificato in questo modo.
$foo[1] = 'Nuovo Secondo';
foreach ($foo as $key => $value) {
	print $key;
}
?>
Ora dovrebbe essere sorprendente che l’ordine finale della serie di sopra sia:
Copia codice

'0, 2, 3, 1'
Eppure, per chi è abituato a lavorare con gli array in altri linguaggi, l’ordine finale è sorprendente. Per riportare le cose in ordine, è necessario usare un ksort() (quicksort – ordine veloce sulle chiavi) per riordinare l’elenco.
Se avete intenzione di implementare un solo tipo di collezione nel linguaggio, penso che una tabella ordinata hash sia la scelta dannatamente migliore …
Io non credo che dovvrebbe essere chiamato array.