2012-10-11 282 views
13

1st off Soy nuevo en PHP. He estado usando for loop, while loop, foreach loop en scripts. Me preguntopara loop vs while loop vs foreach loop PHP

  • cuál es mejor para el rendimiento?
  • ¿Cuál es el criterio para seleccionar un bucle?
  • que debe usarse cuando hacemos un bucle dentro de otro ciclo?

código con el que estoy atascado preguntándome qué lazo usar.

for($i=0;$i<count($all);$i++) 
{ 
//do some tasks here 
for($j=0;$j<count($rows);$j++) 
{ 
    //do some other tasks here 
} 
} 

Es bastante obvio que puedo escribir el código anterior usando while. Espero que alguien me ayude a descubrir qué bucle debería ser mejor para ser utilizado.

+7

No importa el rendimiento. –

+4

Estilísticamente, los bucles incrementales 'for' se usan muy raramente para iterar matrices en PHP. 'foreach' se usa generalmente en su lugar, ya que puede proporcionar tanto la clave de matriz como el valor dentro del bucle. –

Respuesta

23

cuál es mejor para el rendimiento?

No importa.

¿Cuál es el criterio para seleccionar un bucle?

Si solo necesita recorrer todos los elementos de un objeto o matriz, use foreach. Casos en los que necesitafor incluyen

  • Cuando necesite explícitamente a hacer cosas con el índice numérico, por ejemplo:
  • cuando se necesita utilizar elementos anteriores o siguientes dentro de una iteración
  • cuando necesitará cambiar el contador durante una iteración

foreach es mucho más conveniente, ya que no requiere la creación de la cuenta, y puede trabajar su camino a través de cualquier ki nd de miembro, ya sean propiedades de objetos o elementos de matriz asociativa (que no se detectará en for). Por lo general, es mejor para la legibilidad.

que se debe utilizar cuando hacemos un bucle dentro de otro circuito?

Ambos están bien; en su caso de demostración, foreach es la forma más sencilla de hacerlo.

+0

Un bucle 'for' con una matriz normal es (extrañamente) un poco más rápido que la iteración' foreach', pero esa no es una buena razón para usarlo. Es mucho más difícil de leer y no nos permite sustituir cualquier Traversable en lugar de una matriz normal. –

+1

@Francis sí. Además, la diferencia de rendimiento está en * microsegundos * incluso cuando se ejecuta en elementos de 10k (ver el enlace PHPBench de Jason). La diferencia es realmente completamente sin sentido. –

+2

Bueno, el bucle foreach realmente crea una copia de la variable en la memoria para iterar a través de ella, frente a usted está iterando directamente la variable original con el ciclo for. Diferencia insignificante a menos que se trate de millones de elementos. +1 por la increíble respuesta: P –

10

cuál es mejor para el rendimiento?

¿A quién le importa? No será significativo. Nunca. Si este tipo de optimizaciones pequeñas importasen, no estarías usando PHP.

¿Cuál es el criterio para seleccionar un bucle?

Elija la que sea más fácil de leer y la que tenga menos probabilidades de causar errores en el futuro. Cuando recorre los enteros, los bucles for son geniales.Cuando recorre una colección como una matriz, foreach es genial, cuando solo necesita hacer un bucle hasta que esté "terminado", while es genial.

Esto también puede depender de las reglas estilísticas (por ejemplo, en Python casi siempre quiere usar un bucle foreach porque esa es "la manera en que se hace en Python"). Aunque no estoy seguro de cuál es el estándar en PHP.

que se debe utilizar cuando hacemos un bucle dentro de otro circuito?

Cualquiera que sea el tipo de bucle que tenga más sentido (ver la respuesta anterior).

En su código, el bucle for me parece bastante natural, ya que tiene un índice definido de inicio y detención.

5
  • Para obtener un rendimiento que no importa si usted elige un for o un bucle while, el número de iteraciones determinar el tiempo de ejecución.
  • Si conoce el número de iteraciones de golpe, elija un bucle for. Si desea ejecutar y parar en una condición, use un bucle
7

Comprobar http://www.phpbench.com/while para una buena referencia en algunos puntos de referencia de PHP.

El bucle for es generalmente bastante rápido. No incluya su recuento ($ filas) o contar ($ todo) en el por sí mismo, hacer que fuera de esta manera:

$count_all = count($all); 
for($i=0;$i<$count_all;$i++) 
{ 
    // Code here 
} 

La colocación de la cuenta ($ todo) en el bucle lo hace calcular esta declaración para cada ciclo Calcular primero el valor y luego usar el cálculo en el ciclo hace que solo se ejecute una vez.

+2

No estoy de acuerdo con usted en ambos aspectos aquí. Los puntos de referencia realmente no importan: ¿qué diferencia real hace 200 microsegundos en un script PHP? No habrá ninguno. Y mira el código que muestras y compáralo con 'foreach ($ all)'. ¿Cuál es más fácil de leer y mantener? –

+0

Estoy de acuerdo, además de foreach es mucho más agradable de leer también. para los bucles a veces puede mezclarse con todas las referencias a la clave. – DevNinjaJeremy

2
  • bucle for es más apropiado cuando se sabe de antemano cómo muchas iteraciones para realizar
  • Mientras bucle se utiliza en el caso contrario (cuando no se sabe cuántos se necesitan iteraciones)
  • For-Each loop es mejor cuando tiene que iterar sobre las colecciones.

A lo mejor de mi conocimiento, no es poca o ninguna diferencia de rendimiento entre while y para el bucle no sé acerca de la para-cada bucle

0

Rendimiento: lo suficientemente Fácil Probar. Si está haciendo algo así como aprendizaje automático o gran cantidad de datos, debería ver algo que es compilado o ensamblado y no interpretado como; si los ciclos realmente importan. Here are some benchmarks between the various programming languages. Parece que do-while loop es el ganador en mis sistemas usando PHP con estos ejemplos.

$my_var = "some random phrase"; 

function fortify($my_var){ 
    for($x=0;isset($my_var[$x]);$x++){ 
     echo $my_var[$x]." "; 
    } 
} 

function whilst($my_var){ 
    $x=0; 
    while(isset($my_var[$x])){ 
     echo $my_var[$x]." "; 
     $x++; 
    } 
} 

function dowhilst($my_var){ 
    $x=0; 
    do { 
     echo $my_var[$x]." "; 
     $x++; 
    } while(isset($my_var[$x])); 
} 

function forstream(){ 
    for($x=0;$x<1000001;$x++){ 
     //simple reassignment 
     $v=$x; 
    } 
    return "For Count to $v completed"; 
} 

function whilestream(){ 
    $x=0; 
    while($x<1000001){ 
     $v=$x; 
     $x++; 
    } 
    return "While Count to 1000000 completed"; 
} 

function dowhilestream(){ 
    $x=0; 
    do { 
     $v=$x; 
     $x++; 
    } while ($x<1000001); 
    return "Do while Count to 1000000 completed"; 
} 

function dowhilestream2(){ 
    $x=0; 
    do { 
     $v=$x; 
     $x++; 
    } while ($x!=1000001); 
    return "Do while Count to 1000000 completed"; 
} 

$array = array(
    //for the first 3, we're adding a space after every character. 
     'fortify'=>$my_var, 
     'whilst'=>$my_var, 
     'dowhilst'=>$my_var, 
    //for these we're simply counting to 1,000,000 from 0 
    //assigning the value of x to v 
     'forstream'=>'', 
     'whilestream'=>'', 
     'dowhilestream'=>'', 
    //notice how on this one the != operator is slower than 
    //the < operator 
     'dowhilestream2'=>'' 
     ); 

function results($array){ 
    foreach($array as $function=>$params){ 


     if(empty($params)){ 
     $time= microtime(); 
     $results = call_user_func($function); 
     } elseif(!is_array($params)){ 
     $time= microtime(); 
     $results = call_user_func($function,$params); 
     } else { 
     $time= microtime(); 
     $results = call_user_func_array($function,$params); 
     } 
     $total = number_format(microtime() - $time,10); 
     echo "<fieldset><legend>Result of <em>$function</em></legend>".PHP_EOL; 
     if(!empty($results)){ 
      echo "<pre><code>".PHP_EOL; 
      var_dump($results); 
      echo PHP_EOL."</code></pre>".PHP_EOL; 
     } 
     echo "<p>Execution Time: $total</p></fieldset>".PHP_EOL; 
    } 
} 

results($array); 

Criterios:while, for y foreach son las principales estructuras de control de la mayoría de la gente usa en PHP. do-while es más rápido que while en mis pruebas, pero está muy poco utilizado en la mayoría de los ejemplos de codificación PHP en la web.

for es un conteo controlado, por lo que itera un número específico de veces; aunque es más lento en mis propios resultados que usar un while para lo mismo.

while es bueno cuando algo podría comenzar como false, por lo que puede evitar que algo se ejecute y desperdicie recursos.

do-while al menos una vez, y luego hasta que la condición vuelva a false. Es un poco más rápido que un bucle while en mis resultados, pero se ejecutará al menos una vez.

foreach es bueno para iterar a través de array o object. Aunque puede recorrer una cadena con una instrucción for usando sintaxis de matriz, no puede usar foreach para hacerlo en PHP.

control Estructura de anidamiento: Realmente depende de lo que está haciendo para determinar la estructura de control, mientras que para usar cuando se anidan. En algunos casos, como la Programación Orientada a Objetos, en realidad querrás llamar a funciones que contengan tus estructuras de control (individualmente) en lugar de usar programas masivos en estilo de procedimientos que contengan muchos controles anidados. Esto puede facilitar la lectura, la depuración y la creación de instancias.