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
JavaScript Snippets
10% JScript
Vorrei postare un paio di frammenti di codice che ho in giro qui da un po’. Forse gli intenditori sbadiglieranno, ma ci sono un sacco di persone che sono alla ricerca di queste minuzie. Mi sbarazzo di questi appunti che ho…
Hashing delle password in PHP
8% 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…
Ciclare un elenco
8% JQuery
Questo codice scorre una lista non ordinata con un ID di nome ‘bicycle’ in un box animato in una posizione specifica. Può essere usato su qualsiasi elemento con figli. Sostituire “ul#bicycle li” con gli elementi che si des…
Frammenti utili in PHP
6% Php
Se i frammenti di tipo PHP abbondano su Internet, allora perché scriverne un altro? Beh, i frammenti PHP trovati al giro sono generalmente zoppi. Frammenti che generano una stringa casuale o un ritorno di $_SERVER[“REMOTE_…
Problemi con il BOM dell’UTF8
5% Php
Diventa un rompicapo, se si ha il BOM UTF8 all’inizio del file PHP, XML o javascript. Questi files devono inviare la loro intestazione prima di ogni altra cosa. A causa della posizione del BOM, che sono i primi bytes del f…