2008-08-22 28 views
6

Se trata de PHP, pero no tengo dudas de que muchos de los mismos comentarios se aplicarán a otros idiomas.La diferencia entre los bucles

En pocas palabras, ¿cuáles son las diferencias en los diferentes tipos de bucle para PHP? ¿Es uno más rápido/mejor que los demás o debería simplemente ponerlo en el ciclo más fácil de leer?

for ($i = 0; $i < 10; $i++) 
{ 
    # code... 
} 


foreach ($array as $index => $value) 
{ 
    # code... 
} 


do 
{ 
    # code... 
} 
while ($flag == false); 
+2

El rendimiento es muy rara vez un factor de motivación en la elección de una lazo. –

Respuesta

10

Para bucles Loop y While son bucles de condición de entrada. Primero evalúan la condición, por lo que el bloque de declaración asociado con el bucle no se ejecutará ni una vez si la condición no cumple con

Las instrucciones dentro de este bloque de bucle se ejecutarán 10 veces, el valor de $ i será 0 hasta 9;

for ($i = 0; $i < 10; $i++) 
{ 
     # code... 
} 

Lo mismo hizo con el bucle while:

$i = 0; 
while ($i < 10) 
{ 
    # code... 
    $i++ 
} 

do-while es lazo de la salida acondicionado.Está garantizado para ejecutar una vez, entonces se evaluará la condición antes de repetir el bloque

do 
{ 
     # code... 
} 
while ($flag == false); 

foreach se utiliza para acceder a elementos de la matriz de principio a fin. Al comienzo del ciclo foreach, el puntero interno de la matriz se establece en el primer elemento de la matriz, en el siguiente paso se establece en el segundo elemento de la matriz y así sucesivamente hasta que la matriz finalice. En el bloque de bucle El valor del elemento de matriz actual está disponible como $ valor y la clave del elemento actual está disponible como $ index.

foreach ($array as $index => $value) 
{ 
     # code... 
} 

que podría hacer lo mismo con el bucle while, como este

while (current($array)) 
{ 
    $index = key($array); // to get key of the current element 
    $value = $array[$index]; // to get value of current element 

    # code ... 

    next($array); // advance the internal array pointer of $array 
} 

Y por último: The PHP Manual es su amigo :)

0

I utilizar el primer bucle cuando iterar sobre una matriz convencional (indexados?) Y el bucle foreach cuando se trata de una matriz asociativa. Simplemente parece natural y ayuda a que el código fluya y sea más legible, en mi opinión. En cuanto a hacer ... mientras bucles, los uso cuando tengo que hacer algo más que solo hojear una matriz.

No estoy seguro de ningún beneficio de rendimiento, sin embargo.

0

El rendimiento no es significativamente mejor en ninguno de los casos. Aunque es útil para tareas más complejas que la iteración, pero for y while son funcionalmente equivalentes.

Foreach es bueno, pero tiene una advertencia importante: usted no puede modificar el enumerable que está iterando. Así que no eliminar, agregar o reemplazar entradas a/en él. La modificación de entradas (como cambiar sus propiedades) está bien, por supuesto.

0

Con un bucle foreach, se hace una copia de la matriz original en la memoria para usar dentro. No deberías usarlos en estructuras grandes; un simple for loop es una mejor opción. Se puede utilizar un bucle while más eficientemente en una estructura no indexados numéricamente grande como esto:

while(list($key, $value) = each($array)) { 

Pero ese enfoque es particularmente desagradable para una sencilla estructura pequeña.

mientras que los bucles son más adecuados para recorrer a través de arroyos, o como en el siguiente ejemplo que se ve muy a menudo en PHP:

while ($row = mysql_fetch_array($result)) { 

Casi todo el tiempo de los diferentes bucles son intercambiables, y que vendrán hasta a) eficiencia, ob) claridad.

Si conoce las compensaciones de eficiencia de los diferentes tipos de bucles, entonces sí, para responder a su pregunta original: use la que parece más limpia.

1

Ésta es CS101, pero ya que nadie más lo ha mencionado, mientras que los bucles evaluar su condición antes de que el bloque de código, y do-while evalúa después del bloque de código, por lo que los ciclos while siempre están garantizados para ejecutar su bloque de código al menos una vez, independientemente de la condición.

0

Cada construcción de bucle tiene un propósito diferente.

for - Esto se utiliza para repetir un número específico de iteraciones.

foreach: se utiliza para recorrer todos los valores de una colección.

while - Esto se utiliza para seguir hasta que se cumpla una condición.

De los tres, "mientras" probablemente proporcionará el mejor rendimiento en la mayoría de las situaciones. Por supuesto, si haces algo como lo siguiente, básicamente estás reescribiendo el bucle "for" (que en C# es un poco más eficiente).

$count = 0; 
do 
{ 
    ... 
    $count++; 
} 
while ($count < 10); 

Todos tienen diferentes propósitos básicos, pero también se pueden usar de la misma manera. Depende completamente del problema específico que estás tratando de resolver.

1

@brendan:

El artículo que se cita es en serio anticuado y la información es simplemente errónea. Especialmente el último punto (use for en lugar de foreach) es engañoso y la justificación ofrecida en el artículo ya no se aplica a las versiones modernas de .NET.

Si bien es cierto que el IEnumerator utiliza llamadas virtuales, estas pueden en realidad ser inline por un compilador moderno. Además, .NET ahora conoce los genéricos y los enumeradores fuertemente tipados.

Existen muchas pruebas de rendimiento que prueban de manera concluyente que for generalmente no es más rápido que foreach. Here's an example.

+0

El enlace está muerto. – edigu

0

Con un bucle foreach, se hace una copia de la matriz original en la memoria para usar dentro.

Foreach es agradable, pero tiene una advertencia importante: no puede modificar el enumerable que está iterando.

Tanto de los que no será un problema si se pasa por referencia en lugar del valor:

foreach ($array as &$value) { 

Creo que esto ha permitido a partir de PHP 5.

0

Cuando se accede a los elementos de una matriz, para mayor claridad usaría foreach siempre que fuera posible, y solo usaría a para si necesita los valores de índice reales (por ejemplo, el mismo índice en múltiples matrices). Esto también minimiza la posibilidad de errores tipográficos ya que para los bucles esto es muy fácil. En general, PHP puede no ser el lugar donde preocuparse demasiado por el rendimiento. Y por último pero no menos importante, para y foreach tienen (o deberían tener, no soy un PHP-er) el mismo tiempo Big-O (O (n)) por lo que está buscando posiblemente en una pequeña cantidad más de uso de memoria o un ligero golpe constante o lineal en el tiempo.

Cuestiones relacionadas