2012-04-13 10 views
9

Come programmatore PHP, utilizzo gli array per praticamente tutto. So che lo SPLFixedArray può essere utile in certi casi, e so che è PHP arrays aren't very memory efficient, ma raramente mi imbatto in casi reali in cui fanno fatica a fare ciò di cui ho bisogno.Quali sono le caratteristiche del tipo di array di PHP come una struttura di dati?

Questo a differenza di quando lavoro in Java, dove trovo assolutamente fondamentale capire esattamente quali strutture di dati sto usando, e i pro e i contro di ciascuno. Se qualcuno mi suggerisse di usare semplicemente una LinkedHashMap per tutto ciò che è in Java, sarebbero risate fuori dall'edificio.

Quindi, come possiamo cavartela con una tecnica così veloce e libera in PHP? Quali sono le specifiche di base degli array PHP? Viene spesso descritta come "una mappa ordinata", ma lascia molte speculazioni sull'implementazione.

Quali sono alcuni casi d'uso Gli array PHP sono particolarmente buoni a? Quali sono alcuni casi d'uso apparentemente semplici che gli array PHP sono in realtà piuttosto scadenti a?

Ad esempio, presumo c'è una sorta di una migliore gestione degli array denso interi con la carrozzeria (per esempio $arr = array('a','b','c','d','e');) che una mappa hash ordinata, ma allora dove è il confine tra denso e sparso? Gli array diventano drasticamente meno efficienti non appena introduco anche una sola chiave non ordinata, come $arr[10] = 'f';? Che mi dici di $arr[1000000] = 'g';? Immagino che PHP non populi il ~ 1 milione di slot tra parentesi, ma se si tratta di un elenco collegato sotto le copertine, presumibilmente chiamando lo $arr[rand()] = rand(); ripetutamente dovrebbe fare un po 'di riordinamento dopo ogni inserimento?

Qualsiasi risposta che esplori le specifiche di base degli array PHP è benvenuta, anche se non affronta le domande specifiche che sollevo.

+1

Perché nessuno si aspetta che PHP funzioni bene? –

+0

In realtà, [non è previsto alcun riordino] (http://codepad.org/V0Y9K9MZ). Quando si assegna a una chiave inesistente, essa viene posta alla fine dell'array. – Ryan

+6

Sono sorpreso che l'universo non sia stato riavviato dopo che qualcuno ha usato 'PHP' e' punti di forza' nella stessa frase. –

risposta

1

Il problema fondamentale con array PHP è che sono un mash-up di due diversi tipi di dati: gli array e mappe. Arrays a la Javascript o Python sono liste semplici e ordinate, indicizzate numericamente a partire da 0. Molto facile da capire e da usare. Le mappe (ovvero i dizionari) sono raccolte (di solito non ordinate) di coppie chiave-valore. Ancora una volta, molto semplice da capire e da usare.

Gli array PHP possono essere entrambi e agire come entrambi, a seconda di cosa si fa con loro e alcune operazioni che utilizzano le funzioni di array di PHP possono indurli a comportarsi in modi imprevisti. Le chiavi dell'array possono essere (ad esempio) stringhe o numeri interi, ma non è possibile avere una chiave stringa numerica, poiché PHP lo convertirà forzatamente in un numero intero indipendentemente da ciò che si fa. Questo può creare problemi quando (per esempio) si convertono dati da e verso JSON, perché si può finire con più chiavi numeriche simili di tipi diversi.

Gli sviluppatori di PHP avrebbero dovuto mantenere distinti i due tipi di dati. Potrebbe essere conveniente usare la notazione array per creare una mappa al volo, ma non avrebbero dovuto farlo. Non sono un grande fan di Python (... ancora) ma la distinzione formale tra liste e mappe è una cosa che hanno sicuramente fatto meglio di PHP.

1

Gli array PHP sono straordinari nella modellazione di coordinate spaziali arbitrarie. È abbastanza facile creare una cache di valori di rumore perlin: positivo, negativo e così via.

Gli array PHP sono ideali per rappresentare oggetti di configurazione. I tipi di chiavi flessibili lo rendono un gioco da ragazzi.

Gli array PHP ti confondono sulla differenza tra una chiave e un indice. Molto male.

Gli array PHP sono in genere più lenti (anche se potrebbero essere PHP in sé e non proprio gli array) e offrono sempre più opzioni di quelle di cui si ha realmente bisogno. Essa conduce a domande orribili come questa:

PHP: Best way to iterate two parallel arrays?

Basta guardare le sue schiere. Sono ... cosa sono? Elenchi di parametri arbitrari?

Un'altra cosa sono gli array php!

$class->call('func', Array(..params..)); 
+0

Speravo di ottenere un po 'più di discussione sulle strutture dati sottostanti, ma grazie per il vostro contributo. – dimo414

+0

@ dimo414 Allora perché hai accettato il rispondente? – k0pernikus

+0

Non ho avuto più feedback dopo 6+ mesi. Rimuoverò se pensi che otterrò di più. – dimo414

Problemi correlati