2008-08-22 18 views
6

Il s'agit de PHP mais je ne doute pas que les mêmes commentaires s'appliqueront à d'autres langues.La différence entre les boucles

En termes simples, quelles sont les différences dans les différents types de boucle pour PHP? Est-il plus rapide/meilleur que les autres ou devrais-je simplement mettre dans la boucle la plus lisible?

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


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


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

Performance est un facteur de motivation très rarement dans le choix d'un boucle. –

Répondre

10

Pour les boucles en boucle et While sont des boucles d'état d'entrée. Ils évaluent d'abord la condition, de sorte que le bloc d'instructions associé à la boucle ne s'exécute pas une seule fois si la condition ne satisfait pas

Les instructions à l'intérieur de ce bloc de boucle for s'exécuteront 10 fois, la valeur de $ i sera 0 9;

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

Même chose fait avec boucle while:

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

Do-while boucle condition de sortie.Il est garanti d'exécuter une fois, il évaluera l'état avant de répéter le bloc

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

foreach est utilisé pour accéder aux éléments du tableau du début à la fin. Au début de la boucle foreach, le pointeur interne du tableau est défini sur le premier élément du tableau, à l'étape suivante il est défini sur le 2ème élément du tableau et ainsi de suite jusqu'à la fin du tableau. Dans le bloc de boucle La valeur de l'élément de tableau courant est disponible en $ value et la clé de l'item courant est disponible en $ index.

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

Vous pouvez faire la même chose avec en boucle, comme celui-ci

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 
} 

Et enfin: The PHP Manual est votre ami :)

0

J'utilise la première boucle lorsque itérer sur un tableau classique (indexé?) Et la boucle foreach lorsqu'il s'agit d'un tableau associatif. Cela semble naturel et aide le code à couler et à être plus lisible, à mon avis. Comme pour faire ... pendant que les boucles, je les utilise quand je dois faire plus que simplement parcourir un tableau.

Je ne suis pas sûr de tous les avantages de performance, cependant.

0

Les performances ne sont pas significativement meilleures dans les deux cas. While est utile pour les tâches plus complexes que l'itération, mais for et while sont fonctionnellement équivalents.

Foreach est agréable, mais il a une mise en garde importante: vous ne pouvez pas modifier le dénombrable nous parcourons. Donc, ne pas supprimer, ajouter ou remplacer des entrées à/dans. Modifier les entrées (comme changer leurs propriétés) est OK, bien sûr.

0

Avec une boucle foreach, une copie du tableau d'origine est créée en mémoire pour être utilisée à l'intérieur. Vous ne devriez pas les utiliser sur de grandes structures; une simple boucle est un meilleur choix. Vous pouvez utiliser une boucle while plus efficacement sur une grande structure non indexé numériquement comme ceci:

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

Mais cette approche est particulièrement laid pour un simple petite structure.

tandis que les boucles sont mieux adaptés pour une boucle à travers les flux, ou comme dans l'exemple suivant que vous voyez très souvent en PHP:

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

Presque tout le temps les différentes boucles sont interchangeables, et il viendra soit a) l'efficacité, soit b) la clarté.

Si vous connaissez les compromis d'efficacité des différents types de boucles, alors oui, pour répondre à votre question initiale: utilisez celle qui semble la plus propre.

1

Ceci est CS101, mais puisque personne ne l'a mentionné d'autre, alors que les boucles évaluent leur état avant le bloc de code, et do-while évalue après le bloc de code, de sorte que les boucles do-while sont toujours garanties pour exécuter leur bloc de code au moins une fois, quelle que soit la condition.

0

Chaque construction de boucle un objectif différent. For - Ceci est utilisé pour effectuer une boucle pour un nombre spécifique d'itérations. Foreach - Ceci est utilisé pour parcourir toutes les valeurs d'une collection.While (

)

while - Ceci est utilisé pour faire une boucle jusqu'à ce que vous remplissiez une condition. Sur les trois, "while" offrira probablement les meilleures performances dans la plupart des situations. Bien sûr, si vous faites quelque chose comme ce qui suit, vous réécrivez essentiellement la boucle "for" (qui est légèrement plus performante dans C#). Ils ont tous des objectifs basiques différents, mais ils peuvent aussi être utilisés de la même manière. Cela dépend complètement du problème spécifique que vous essayez de résoudre.

1

@brendan:

L'article que vous citez est sérieusement dépassée et l'information est tout simplement faux. Surtout le dernier point (utilisation for au lieu de foreach) est trompeur et la justification offerte dans l'article ne s'applique plus aux versions modernes de .NET.

Il est vrai que le IEnumerator utilise des appels virtuels, ceux-ci peuvent être inline fait par un compilateur moderne. En outre, .NET connaît maintenant des génériques et des énumérateurs fortement typés.

Il ya beaucoup de tests de performance là-bas qui prouvent de façon concluante que for n'est généralement pas plus rapide que foreach. Here's an example.

+0

Le lien est mort. – edigu

0

Avec une boucle foreach, une copie de la matrice d'origine est créée en mémoire pour être utilisée à l'intérieur.

Foreach est agréable, mais a une mise en garde importante: vous ne pouvez pas modifier l'énumérable que vous itérez.

ces deux ne sera pas un problème si vous passez par référence au lieu de la valeur:

foreach ($array as &$value) { 

Je pense que cela a été permis depuis PHP 5.

0

Lorsque vous accédez aux éléments de un tableau, pour plus de clarté, j'utiliserais foreach chaque fois que possible, et j'utiliserais un pour si vous avez besoin des valeurs d'index réelles (par exemple, le même index dans plusieurs tableaux). Cela minimise également les risques de fautes de frappe, car les boucles rendent cela trop facile. En général, PHP n'est peut-être pas le lieu de s'inquiéter trop de la performance. Et last but not least, for et foreach ont (ou devraient avoir, je ne suis pas un PHP-er) le même temps Big-O (O (n)) donc vous cherchez peut-être un peu plus d'utilisation de la mémoire ou un léger coup constant ou linéaire dans le temps.