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:
<?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:
<?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:
<?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:
0 1 2 3 4 5 6 7
Infatti, stampa questo:
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:
<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:
'a a a a b a a a'
Invece, la stampa in realtà è
'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:
<?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:
'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.
Similari
Python per tutti
474% Python
Python para todos è un libro sulla programmazione in Python. Questo è un tutoriale su Python adatto a tutti i livelli e si può scaricare in pdf gratuitamente in spagnolo. Il tutoriale di Python…
Hashing delle password in PHP
232% Php
Molte delle moderne applicazioni in PHP accedono a informazioni importanti dell’utente e le memorizzano in un database. Ad esempio, una web app potrebbe avere un sistema di registrazione per i nuovi utenti. Ma come si dovr…
Fondamentali di jQuery
123% JQuery
jQuery stà diventando rapidamente uno strumento che ogni sviluppatore web di interfacce dovrebbe conoscere. Lo scopo di questo libro è di fornire una panoramica della biblioteca, in modo che qu…
Guida allo Zend Framework
54% Zend
Zend Framework è un framework open source per PHP. Zend Framework separa la logica e le azioni usando il pattern MVC (Model View Controller). Cosa è lo Zend Framework? Framework per la costruzione di siti web più veloci e …
Introduzione al PHP
47% Php
Scopri ed esplora la programmazione di scripting server side con il linguaggio PHP. Questo post è rivolto a persone che sono nuovi alla programmazione. Non è adatto a persone che già hanno competenze di programmazione di b…