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
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];
}
?>
<?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;
}
?>
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);
?>
Se si trattasse di un vero array, la stringa finale dovrebbe stampare questo:
0 1 2 3 4 5 6 7
7 6 5 4 3 2 1 0
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);
?>
'a a a a b a a a'
'a a a a a a a b'
$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;
}
?>
'0, 2, 3, 1'
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
.
Ancora nessun commento