2009-08-25 1 views
7

Il tipo di array PHP è in realtà più simile a una mappa ordinata che a un array C tradizionale. È la struttura dati originale di utilizzo generale di PHP. Il manuale va al punto The indexed and associative array types are the same type in PHP, which can both contain integer and string indices.Quali sono le differenze pratiche tra le matrici "associate" e "indicizzate" in PHP?

Tuttavia, ci sono molti casi in cui le funzionalità del linguaggio incorporato fanno una distinzione tra array "indicizzati" (array con chiavi sequenziali, integer) e array "associativi" (array con non sequenziali e/o chiavi di tipi misti).

Un esempio di questa è la funzione array_merge.

Se gli array di input hanno gli stessi tasti stringa, il valore successivo per quel tasto sovrascriverà quello precedente. Se, tuttavia, gli array contengono chiavi numeriche, il valore successivo non sovrascriverà il valore originale, ma verrà aggiunto.

Se viene fornito solo un array e l'array viene indicizzato numericamente, i tasti vengono reindirizzati in modo continuo.

Quali sono gli altri posti in PHP in cui viene fatta una distinzione tra array indicizzati e associativi? Sono interessato in particolare alle differenze Userland, anche se qualsiasi approfondimento sull'implementazione dell'array nella sorgente di PHP sarebbe interessante.

risposta

3

Quello più diffuso che viene in mente è che un array indicizzato può essere ciclico tramite un tradizionale for ciclo, mentre un uno associativo non può (perché non ha gli indici numerici):

for ($i = 0; $i < count($indexed_array); $i++) 
{ 
    // do something with $indexed_array[$i] 
} 

Ovviamente, php ha anche una parola chiave foreach, che funziona allo stesso modo su entrambi i tipi.

+1

+1 per buone informazioni, ma è opportuno notare che è possibile eseguire il loop su un array indicizzato e un array associato utilizzando la funzione next(). In altre parole, gli array associativi hanno ancora un concetto interno di ordine. –

+1

Vero, e lungo quelle linee, un array indicizzato non ha necessariamente l'ordine previsto - piuttosto, l'ordine che usa l'array (con 'foreach' o' next() ', attenzione) dipende dall'ordine in cui era popolato, quindi se $ arr [3] è stato impostato prima di $ arr [2], quell'ordine verrà mantenuto quando viene ripetuto l'iterazione. –

0

Praticamente tutte le principali funzioni di ordinamento (con tutte le variazioni sort, ksort, asort a seconda se si desidera mantenere l'associazione di chiave e così via).

5

In realtà, qualsiasi array, indipendentemente dal fatto che sia indicizzato o associativo, è una tabella hash (più una lista doppiamente collegata per il mantenimento dell'ordine degli elementi) in PHP. Tuttavia, nel codice PHP degli utenti, gli array indicizzati e associativi servono quasi sempre a scopi diversi ea volte devono essere trattati in modi diversi, quindi diverse funzioni come sort/asort fanno una distinzione tra loro solo per comodità.

+0

+1 per la distinzione tra l'implementazione e il codice userland. Sono le cose degli utenti che mi interessano. –

3

.. e quindi c'è SplFixedArray, a partire da 5.3, supporta solo indici interi, ha dimensioni fisse ed è generalmente più veloce degli array nativi.

+2

+1 per le informazioni, ma ricorda che gli oggetti standard della libreria PHP PHP non saranno compatibili con le funzioni di array PHP esistenti, che possono essere irritanti per le vecchie mani. –

2

Una differenza interessante che ho trovato è quando si utilizza json_encode.

json_encode(array(0=>0,1=>1,2=>2)); 
> [0,1,2] 
json_encode(array(0=>0,2=>2)); 
> {"0":0,"2":2} 

Come esempio solitario questo ha un senso, ma è ancora più sorprendente quando combinato con, diciamo, array_filter.

$f = function($x) { return $x != 1; }; 
json_encode(array_filter(array(0,1,2), $f)); 
> {"0":0,"2":2} 

Abbiamo iniziato con un array numerico, filtrato alcuni elementi, ma la json risultante è un array associativo!


Si noti che possiamo ottenere il JSON desiderato utilizzando array_values.

json_encode(array_values(array_filter(array(0,1,2),$f))); 
> [0,2]