web-dev-qa-db-fra.com

pour boucle vs tandis que boucle vs boucle foreach PHP

Tout d'abord, je suis nouveau en PHP. J'utilise for, boucle while, boucle foreach dans les scripts. je me demande 

  • lequel est le meilleur pour la performance?
  • quels sont les critères pour sélectionner une boucle?
  • qui devrait être utilisé quand on boucle dans une autre boucle?

le code que je suis coincé avec se demandant quelle boucle utiliser.

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

Il est assez évident que je puisse écrire le code ci-dessus en utilisant while. J'espère que quelqu'un m'aidera à déterminer quelle boucle devrait être mieux utilisée.

18
Techie

lequel est le meilleur pour la performance?

Ça n'a pas d'importance.

quels sont les critères pour sélectionner une boucle?

Si vous avez juste besoin de parcourir tous les éléments d'un objet ou d'un tableau, utilisez foreach. Cas où vous avez besoin for include

  • Lorsque vous avez explicitement besoin de faire quelque chose avec l'index numérique, par exemple:
  • lorsque vous devez utiliser des éléments précédents ou suivants à partir d'une itération
  • quand vous avez besoin de changer le compteur pendant une itération

foreach est beaucoup plus pratique car il ne vous oblige pas à compter, et peut fonctionner à travers tout type de membre - que ce soit des propriétés d'objet ou des éléments de tableau associatif (qu'un for ne capture pas). C'est généralement mieux pour la lisibilité.

qui devrait être utilisé quand on boucle dans une autre boucle?

Les deux vont bien; Dans votre cas de démonstration, foreach est la solution la plus simple.

34
Pekka 웃

lequel est le meilleur pour la performance?

On s'en fout? Ce ne sera pas significatif. Déjà. Si ces petites optimisations importaient, vous n’utiliseriez pas PHP.

quels sont les critères pour sélectionner une boucle?

Choisissez celui qui est le plus facile à lire et le moins susceptible de causer des erreurs à l'avenir. Lorsque vous parcourez des entiers, les boucles for sont excellentes. Lorsque vous parcourez une collection comme un tableau, foreach est génial, lorsque vous avez juste besoin de boucler jusqu'à ce que vous ayez terminé, while est génial.

Cela peut également dépendre de règles stylistiques (par exemple, dans Python, vous souhaiterez presque toujours utiliser une boucle foreach car c'est "comme cela se fait en Python"). Je ne suis pas sûr de savoir quelle est la norme dans PHP cependant.

qui devrait être utilisé quand on boucle dans une autre boucle?

Quel que soit le type de boucle le plus logique (voir la réponse ci-dessus).

Dans votre code, la boucle for me semble assez naturelle, car vous avez un index de démarrage et d'arrêt défini. 

13
Brendan Long

Vérifiez http://www.phpbench.com/ pour une bonne référence sur certains points de repère PHP.

La boucle for est généralement assez rapide. N'incluez pas votre nombre ($ lignes) ni le nombre ($ tout) dans le pour soi, faites-le dehors comme ceci:

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

Placer le nombre ($ all) dans la boucle for lui permet de calculer cette instruction pour chaque boucle. Le calcul de la valeur en premier lieu, puis l'utilisation du calcul dans la boucle ne l'exécutent qu'une seule fois.

7
Jason
  • Pour les performances, peu importe si vous choisissez une boucle for ou while, le nombre d'itérations détermine le temps d'exécution.
  • Si vous connaissez le nombre d'itérations à l'avance, choisissez une boucle for. Si vous souhaitez exécuter et arrêter une condition, utilisez une boucle while
5
JvdBerg
  • la boucle for est plus appropriée lorsque vous savez à l'avance combien d'itérations à effectuer
  • La boucle While est utilisée dans le cas contraire (quand vous ne savez pas combien d'itérations Sont nécessaires)
  • La boucle For-Each est préférable lorsque vous devez parcourir plusieurs collections.

À ma connaissance, il n'y a pas ou peu de différence de performance entre les boucles while et for, je ne connais pas les boucles for-each

2
Yohannis

Performance: Assez facile à tester. Si vous faites quelque chose comme l'apprentissage automatique ou le Big Data, vous devriez vraiment regarder quelque chose qui est compilé ou assemblé et non pas interprétési les cycles vraiment importent. Voici quelques points de repère entre les différents langages de programmation. On dirait que la boucle do-while est gagnante sur mes systèmes en utilisant PHP avec ces exemples.

$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);

Critères:while , pour , et foreach sont les principales structures de contrôle utilisées par la plupart des utilisateurs de PHP. do-while est plus rapide que while dans mes tests, mais largement sous-utilisé dans la plupart des exemples de codage PHP sur le Web.

for est contrôlé par le nombre, donc il itère un nombre spécifique de fois; bien que mes résultats donnent plus de lenteur que l’utilisation de while pour la même chose.

while est utile lorsque quelque chose peut commencer par false, afin d'éviter que quelque chose ne s'exécute et ne gaspille des ressources.

do-while au moins une fois, puis jusqu'à ce que la condition renvoie false. C'est un peu plus rapide qu'une boucle while dans mes résultats, mais elle s'exécutera au moins une fois.

foreach est bon pour parcourir une array ou object. Même si vous pouvez parcourir une chaîne avec une instruction for en utilisant la syntaxe d'un tableau, vous ne pouvez pas utiliser foreach pour le faire en PHP.

Imbrication de la structure de contrôle: _ Cela dépend vraiment de ce que vous faites pour déterminer la structure de contrôle while à utiliser lors de l'imbrication. Dans certains cas, comme la programmation orientée objet, vous voudrez en fait appeler des fonctions qui contiennent vos structures de contrôle (individuellement) plutôt que d'utiliser des programmes volumineux de style procédural contenant de nombreux contrôles imbriqués. Cela peut faciliter la lecture, le débogage et l’instanciation.

0
AbsoluteƵERØ