2012-02-14 20 views
6

Ho una domanda che non riesco a trovare una risposta.riferimento php array passando alla funzione

Sto costruendo una grande matrice che contiene i valori esadecimali di un file (come $array[0]=B5$array[1]=82 e così via fino $array[1230009])

Quando creo una funzione di manipolare alcune compensazioni in tale matrice e passare il $array come riferimento (function parse(&$array) { ... }) richiede WAY più a lungo di se passo la matrice normale (function parse($array) { ... }) ..

Come è possibile?

PS: C'è un modo più veloce per non utilizzare l'array? Solo per usare $ string = "B5 82 00 1E ..etc", ma ho bisogno di tracciare l'Offset man mano che avanzo nella lettura di valori esadecimali poiché alcuni valori contengono lunghezze "

+1

Ci vuole più tempo per passare la matrice, o ci vuole più tempo per svolgere la funzione sulla matrice che si passaggio? Inoltre, questo non è un metodo efficiente per la RAM che fa riferimento a ciascun byte di un file. Dovresti usare le stringhe invece che methinks. – crush

+0

possibile duplicato di [In PHP (> = 5.0), sta passando per riferimento più veloce?] (Http://stackoverflow.com/questions/178328/in-php-5-0-is-passing-by-reference-faster) – PeeHaa

+0

ci vogliono 30 secondi per eseguire la funzione sull'array (per riferimento) e 2 secondi per eseguire la funzione sull'array passando normalmente – pufos

risposta

3

Ci sono alcune informazioni che potrebbero aiutare nel seguente articolo: Do not use PHP references

Vicino alla fine di quel posto, Johannes messaggi la seguente porzione di codice (citando):

function foo(&$data) { 
    for ($i = 0; $i < strlen($data); $i++) { 
     do_something($data{$i}); 
    } 
} 

$string = "... looooong string with lots of data ....."; 
foo(string); 

E una parte del commento che lo accompagna è (ancora citando):

Ma ora in questo caso lo sviluppatore ha cercato di essere intelligente e di risparmiare tempo a passando un riferimento.
Ma beh, strlen() si aspetta una copia.
copy-on-write non può essere fatto su riferimenti in modo $data saranno copiato per chiamare strlen(), strlen() farà un assolutamente semplice operazione - infatti strlen() è una delle funzioni più banali in PHP - e la copia verrà immediatamente distrutta.

Si potrebbe anche essere in una situazione come questa, considerando la questione si sta chiedendo ...

+0

MODIFICATO: Ok lo capisco ora ma: Come usare stringhe come $ stringa = " B5 82 00 1E .... ecc. "? Ma ho bisogno di eseguire un login su ogni valore esadecimale e ho bisogno di mantenere l'offset man mano che avanzo nel leggerlo – pufos

Problemi correlati