2010-02-27 19 views
5

estoy usando un bucle foreach dentro de PHP similar a esto:PHP bucles Foreach

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

En cuanto a la eficiencia, es mejor tener una declaración $attributes = $class->getAttributes(); fuera del bucle foreach y iterar sobre la variable $attributes? ¿O la declaración $class->getAttributes() solo se llama una vez dentro de la declaración foreach al principio?

(I se dan cuenta de esto podría no ser una gran preocupación eficiencia en este caso, pero me gustaría saber el principio de este y otros casos de mayor tamaño)

Gracias,

Steve

Respuesta

15

Al usar $class->getAttributes() fuera del ciclo foreach y usar una variable temporal, o mantenerla como la escribió, no debe cambiar nada el rendimiento: se evaluará solo una vez.

Y aquí es un ejemplo que lo demuestra:

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 />"; 
} 

estoy usando una función y no un método de una clase, para obtener un ejemplo más corto, pero el principio sería el mismo con una clase + método.


y llamar a esta porción de código da el siguiente resultado:

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

es decir, la función de get_array() solamente se llama una vez, al comienzo del bucle foreach.

1

no lo he probado, pero me gustaría pensar que hacer algo como esto:

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

} 

Es más fácil de leer, y se puede llegar a los atributos después del ha concluir si es necesario.

Sin embargo, en una respuesta más directa a su pregunta, getAttributes() solo se llamará una vez en ambos casos.

+0

+1 para la conveniencia de acceder a '$ attributes' fuera del ciclo. – thetaiko

2

foreach opera en una copia internamente:

Nota: A menos que se hace referencia a la matriz, foreach opera en una copia de la matriz especificada y no a la propia matriz. [...]

Por lo tanto, no hace ninguna diferencia en su caso. $class->getAttributes() solo se llama una vez para recuperar la matriz.

1

Como han dicho otros, la función de su ejemplo solo se llama una vez.

El caso en el que la evaluación previa puede marcar la diferencia es para los bucles.

$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++); 
Cuestiones relacionadas