Question

C'est à propos de PHP, mais je n'ai aucun doute beaucoup de la même observation s'applique à d'autres langues.

Tout simplement, quelles sont les différences entre les différents types de boucle pour PHP?Est une plus vite ou mieux que les autres, ou devrais-je simplement mettre dans le plus lisible boucle?

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


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


do
{
    # code...
}
while ($flag == false);
Était-ce utile?

La solution

Pour la boucle et boucle While entrée de la condition des boucles.Ils évaluent d'abord la condition, de sorte que le bloc d'instructions associées à la boucle ne fonctionne pas même une seule fois si l'état ne parvient pas à répondre

Les instructions à l'intérieur de cette boucle bloc sera exécuté 10 fois, la valeur de $i sera de 0 à 9;

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

Même chose fait avec boucle while:

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

-Lors de la boucle est sortie de la condition de la boucle.Il est garanti à exécuter une fois, puis il va évaluer l'état avant de répéter le bloc

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

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

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

On pourrait faire la même chose avec en boucle, comme ceci

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: Le Manuel PHP est votre ami :)

Autres conseils

C'est CS101, mais puisque personne n'a encore mentionné, tandis que les boucles d'évaluer leur état avant le bloc de code, et, tandis que les évalue après le bloc de code, de sorte que, tandis que les boucles sont toujours assuré pour leur bloc de code au moins une fois, quelle que soit la condition.

@brendan:

L'article que vous avez cité est sérieusement désuet et l'information est tout simplement faux.Surtout le dernier point (l'utilisation for au lieu de foreach) est trompeuse, et la justification dans l'article ne s'applique plus à des versions modernes de .NET.

S'il est vrai que l' IEnumerator utilise les appels virtuels, ces peut en fait être incorporé par un compilateur moderne.En outre, l' .NET sait maintenant génériques et fortement typé agents recenseurs.

Il ya beaucoup de tests de performances qui prouvent de façon concluante que for n'est généralement pas plus vite que foreach. Voici un exemple.

J'utilise la première boucle lors d'une itération classique (indexé?) tableau et la boucle foreach lorsque vous traitez avec un tableau associatif.Il semble tout à fait naturel et aide le flux de code et d'être plus lisible, à mon avis.Comme pour do...while, j'utilise lorsque je dois faire plus que de simplement parcourir un tableau.

Je ne suis pas sûr de tout les avantages de performance, mais.

La Performance n'est pas significativement meilleure dans les deux cas.Tout est utile pour les tâches plus complexes que l'itération, mais for et while sont fonctionnellement équivalents.

Foreach c'est sympa, mais a une mise en garde importante:vous ne pouvez pas modifier l'énumérable vous êtes l'itération.Donc pas de suppression, d'ajout ou de remplacement de participations à/en elle.Modification des entrées (comme le changement de leurs propriétés) est OK, bien sûr.

Avec une boucle foreach, une copie du tableau original est fait en mémoire à utiliser à l'intérieur.Vous ne devriez pas les utiliser sur les grandes structures;une simple boucle for est un meilleur choix.Vous pouvez utiliser une boucle while plus efficacement sur un grand non-indexé numériquement structure comme ceci:

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

Mais cette approche est particulièrement moche pour une simple petite structure.

tandis que les boucles sont mieux adaptés pour faire des boucles dans les ruisseaux, ou, comme dans l'exemple suivant, 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 vers le bas pour soit a) l'efficacité, ou b) la clarté.

Si vous connaissez l'efficacité de compromis entre les différents types de boucles, alors oui, pour répondre à votre question initiale:utilisez celui qui ressemble le plus propre.

Chaque construction de boucle sert un but différent.

pour Ce est utilisé pour la boucle pour un certain nombre d'itérations.

foreach - Ce est utilisé pour parcourir l'ensemble des valeurs dans une collection.

tout - Ceci est utilisé pour faire une boucle jusqu'à ce que vous satisfaire à une condition.

Des trois, "tout" sera très probablement fournir les meilleures performances dans la plupart des situations.Bien sûr, si vous faites quelque chose comme ce qui suit, vous êtes essentiellement la réécriture de la boucle "for" (qui en c# est un peu plus performant).

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

Qu'ils ont tous des objectifs de base, mais ils peuvent également être utilisés dans un peu de la même façon.Il dépend entièrement sur le problème spécifique que vous essayez de résoudre.

Avec une boucle foreach, une copie du tableau original est fait en mémoire à utiliser à l'intérieur.

Foreach, c'est sympa, mais a une mise en garde importante:vous ne pouvez pas modifier l'énumérable vous êtes l'itération.

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é admis depuis PHP 5.

Lors de l'accès aux éléments d'un tableau, pour plus de clarté, je voudrais utiliser un foreach chaque fois que possible, et utiliser uniquement pour si vous avez besoin de les réelles valeurs de l'indice (par exemple, le même indice dans plusieurs tableaux).Ceci réduit également la chance pour la faute de frappe erreurs depuis des boucles rendre tout cela un peu trop facile.En général, PHP ne peut pas être le lieu de trop se préoccuper de la performance.Et le dernier mais non le moindre, for et foreach ont (ou devraient avoir;Je ne suis pas un PHP-er) de la même Grand-temps O (O(n)) de sorte que vous cherchez, éventuellement, à une petite quantité de plus de l'utilisation de la mémoire ou une légère constant ou linéaire frappé dans le temps.

En ce qui concerne la performance, un foreach est plus long que pour un

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top