2010-02-27 19 views
5

Sto usando un ciclo foreach all'interno di PHP simile a questo:PHP Ciclo Foreach efficienza

foreach ($class->getAttributes() as $attribute) { 
// Work 
} 

Per quanto riguarda l'efficienza, è meglio avere una dichiarazione $attributes = $class->getAttributes(); fuori del ciclo foreach e iterare la variabile $attributes? Oppure la dichiarazione $class->getAttributes() viene richiamata solo una volta all'interno della dichiarazione foreach all'inizio?

(mi rendo conto che questo potrebbe non essere una grande preoccupazione efficienza in questo caso, ma vorrei sapere il principio per questo e altri casi più grandi)

Grazie,

Steve

risposta

15

L'utilizzo del $class->getAttributes() al di fuori del ciclo foreach e l'utilizzo di una variabile temporanea o il mantenimento come si scriveva non dovrebbe modificare nulla sulle prestazioni: verrà comunque valutato solo una volta.

Ed ecco un esempio che lo dimostra:

function get_array() { 
    echo 'function called !<br />'; 
    return array(
     'first' => 123, 
     'second' => 456, 
     'last' => 789, 
    ); 
} 
foreach (get_array() as $key => $value) { 
    echo "$key : $value<br />"; 
} 

Sto usando una funzione e non un metodo di una classe, per ottenere un esempio più corto, ma il principio sarebbe lo stesso con una classe + metodo.


e chiamando questa porzione di codice pronunciato la seguente output:

function called ! 
first : 123 
second : 456 
last : 789 

cioè la funzione get_array() viene chiamata solo una volta, all'inizio del ciclo foreach.

1

non ho ancora testato, ma mi piacerebbe pensare che fare qualcosa di simile:

$attributes = $class->getAttributes(); 
foreach($attributes as $attribute) 
{ 

} 

è più leggibile, e si può ottenere agli attributi dopo il foreach è concludere se è necessario.

Tuttavia, in una risposta più diretta alla tua domanda, getAttributes() verrà chiamato una sola volta in entrambi i casi.

+0

+1 per la comodità di accedere a '$ attributes' al di fuori del ciclo. – thetaiko

2

foreach opera su una copia internamente:

Nota: meno che la matrice viene fatto riferimento, foreach opera su una copia dell'array specificato e non la matrice stessa. [...]

Quindi non fa alcuna differenza nel tuo caso. $class->getAttributes() viene chiamato solo una volta per recuperare la matrice.

1

Come altri hanno già detto, la funzione nell'esempio viene chiamata una sola volta.

Il caso in cui la pre-valutazione può fare la differenza è per i loop.

$str = 'abcdefghijklmnop'; 

//strlen will be called on every iteration 
for($i = 0; $i < strlen($str); $i++); 

//strlen will only be called once 
$len = strlen($str); 
for($i = 0; $i < $len; $i++);