Pregunta

Se trata de PHP, pero no tengo dudas de que muchos de los mismos comentarios se aplicarán a otros lenguajes.

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

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


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


do
{
    # code...
}
while ($flag == false);
¿Fue útil?

Solución

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

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

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

Lo mismo se hace con el bucle while:

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

El bucle Do- while es un bucle de condición de salida.Está garantizado que se ejecutará una vez, luego evaluará la condición antes de repetir el bloque.

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

foreach se utiliza para acceder a los elementos de la matriz de principio a fin.Al comienzo del bucle 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 finaliza la matriz.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...
}

Podrías 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: El manual de PHP es tu amigo :)

Otros consejos

Este es CS101, pero como nadie más lo ha mencionado, los bucles while evalúan su condición antes del bloque de código, y do- while evalúa después del bloque de código, por lo que siempre se garantiza que los bucles do- while ejecuten su bloque de código al menos una vez. independientemente de la condición.

@brendan:

El artículo que citó está muy desactualizado y la información es simplemente incorrecta.Especialmente el último punto (usar 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 poder en realidad estar integrado por un compilador moderno.Además, .NET ahora conoce enumeradores genéricos y fuertemente tipados.

Existen muchas pruebas de rendimiento que demuestran de manera concluyente que for generalmente no es más rápido que foreach. Aquí hay un ejemplo.

Utilizo el primer bucle cuando itero sobre una matriz convencional (¿indexada?) y el bucle foreach cuando trato con una matriz asociativa.En mi opinión, parece natural y ayuda a que el código fluya y sea más legible.En cuanto a los bucles do... while, los uso cuando tengo que hacer algo más que hojear una matriz.

Sin embargo, no estoy seguro de que haya beneficios en el rendimiento.

El rendimiento no es significativamente mejor en ninguno de los casos.Si bien 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:tú no se puede modificar el enumerable que estás iterando.Por lo tanto, no se pueden eliminar, agregar ni reemplazar entradas en él.Modificar entradas (como cambiar sus propiedades) está bien, por supuesto.

Con un bucle foreach, se crea una copia de la matriz original en la memoria para usarla en su interior.No deberías usarlos en estructuras grandes;un bucle for simple es una mejor opción.Puedes usar un bucle while de manera más eficiente en una estructura grande no indexada numéricamente como esta:

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

Pero ese enfoque es particularmente feo para una estructura pequeña y simple.

Los bucles while son más adecuados para recorrer secuencias, o como en el siguiente ejemplo que se ve con mucha frecuencia en PHP:

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

Casi todo el tiempo, los diferentes bucles son intercambiables y todo se reducirá a a) eficiencia ob) claridad.

Si conoce las ventajas y desventajas de eficiencia de los diferentes tipos de bucles, entonces sí, para responder a su pregunta original:Utilice el que se vea más limpio.

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

for: se utiliza para realizar un bucle durante un número específico de iteraciones.

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

while: se utiliza para realizar un bucle 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# tiene un rendimiento ligeramente mayor).

$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 intentando resolver.

Con un bucle foreach, se crea una copia de la matriz original en la memoria para usarla en su interior.

Foreach es bueno, pero tiene una advertencia importante:no puedes modificar el enumerable que estás iterando.

Ambos no serán un problema si pasas por referencia en lugar de valor:

 foreach ($array as &$value) {

Creo que esto está permitido desde PHP 5.

Al acceder a los elementos de una matriz, para mayor claridad, usaría un foreach siempre que sea posible y solo usaría un for si necesita los valores de índice reales (por ejemplo, el mismo índice en varias matrices).Esto también minimiza la posibilidad de errores tipográficos, ya que los bucles for lo hacen muy fácil.En general, es posible que PHP no sea el lugar adecuado para preocuparse demasiado por el rendimiento.Y por último, pero no menos importante, for y foreach tienen (o deberían tener;No soy un experto en PHP) el mismo tiempo de Big-O (O(n)), por lo que posiblemente esté viendo una pequeña cantidad adicional de uso de memoria o un ligero impacto constante o lineal en el tiempo.

En lo que respecta al rendimiento, un foreach consume más que un for

http://forums.asp.net/p/1041090/1457897.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top