6

It's about PHP but I've no doubt many of the same comments will apply to other languages.

Simply put, what are the differences in the different types of loop for PHP? Is one faster/better than the others or should I simply put in the most readable loop?

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


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


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

11 に答える 11

10

For ループと While ループは、開始条件ループです。最初に条件を評価するため、条件が満たされない場合、ループに関連付けられたステートメント ブロックは 1 回も実行されません。

この for ループ ブロック内のステートメントは 10 回実行され、$i の値は 0 から 9 になります。

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

同じことが while ループで行われます:

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

do-while ループは終了条件ループです。一度実行されることが保証され、ブロックを繰り返す前に条件を評価します

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

foreach は、最初から最後まで配列要素にアクセスするために使用されます。foreach ループの開始時に、配列の内部ポインターが配列の最初の要素に設定され、次のステップで配列の 2 番目の要素に設定され、配列が終了するまで続きます。ループ ブロック内 現在の配列アイテムの値は $value として使用でき、現在のアイテムのキーは $index として使用できます。

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

次のように、while ループでも同じことができます。

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
}

そして最後に: PHP マニュアルはあなたの友達です :)

于 2008-08-23T01:44:16.553 に答える
1

@brendan:

あなたが引用した記事はひどく時代遅れであり、情報はまったく間違っています。特に最後のポイント(のfor代わりに使用foreach)は誤解を招くものであり、この記事で提供されている正当化は、最新バージョンの.NETには適用されなくなりました。

IEnumeratorが仮想呼び出しを使用しているのは事実ですが、これら実際には最新のコンパイラーによってインライン化できます。さらに、.NETはジェネリックスと強く型付けされた列挙子を認識します。

そこには多くのパフォーマンステストがあり、それforが一般的にはより速くないことが決定的に証明されていforeachます。これが例です。

于 2008-08-22T17:52:33.770 に答える
1

これは CS101 ですが、誰も言及していないため、while ループはコード ブロックの前に条件を評価し、do-while はコード ブロックの後に評価するため、do-while ループはコード ブロックを少なくとも 1 回実行することが常に保証されます。条件に関係なく。

于 2008-08-22T16:46:47.143 に答える
1

PHP ベンチマーク

于 2008-08-22T16:48:12.130 に答える
0

foreachループを使用すると、元の配列のコピーがメモリ内に作成され、内部で使用されます。

Foreachは優れていますが、重要な注意点が1つあります。反復している列挙型を変更することはできません。

値の代わりに参照を渡す場合、これらの両方は問題になりません。

 foreach ($array as &$value) {

これはPHP5以降許可されていると思います。

于 2008-08-22T23:30:52.677 に答える
0

配列の要素にアクセスするときは、わかりやすくするために、可能な限りforeachを使用し、実際のインデックス値(たとえば、複数の配列で同じインデックス)が必要な場合にのみforを使用します。これにより、forループによってこれが非常に簡単になるため、タイプミスの可能性も最小限に抑えられます。一般に、PHPはパフォーマンスについてあまり心配する場所ではないかもしれません。そして最後に大事なことを言い忘れましたが、forとforeachは同じBig-O時間(O(n))を持っている(または持っているべきです;私はPHP-erではありません)ので、おそらく少量のメモリ使用量または時間内のわずかな一定または線形のヒット。

于 2008-08-22T23:47:01.500 に答える
0

I use the first loop when iterating over a conventional (indexed?) array and the foreach loop when dealing with an associative array. It just seems natural and helps the code flow and be more readable, in my opinion. As for do...while loops, I use those when I have to do more than just flip through an array.

I'm not sure of any performance benefits, though.

于 2008-08-22T16:34:58.387 に答える
0

Performance is not significantly better in either case. While is useful for more complex tasks than iterating, but for and while are functionally equivalent.

Foreach is nice, but has one important caveat: you can't modify the enumerable you're iterating. So no removing, adding or replacing entries to/in it. Modifying entries (like changing their properties) is OK, of course.

于 2008-08-22T16:37:42.983 に答える
0

foreach ループを使用すると、元の配列のコピーがメモリ内に作成され、内部で使用されます。大規模な構造では使用しないでください。単純な for ループの方が適しています。次のように、数値でインデックス付けされていない大規模な構造体では、while ループをより効率的に使用できます。

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

しかし、そのアプローチは、単純で小さな構造の場合は特に醜いです。

while ループは、ストリームをループする場合や、PHP で非常に頻繁に見られる次の例のように適しています。

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

ほとんどの場合、異なるループは交換可能であり、それは a) 効率、または b) 明快さのいずれかに帰着します。

さまざまな種類のループの効率のトレードオフを知っている場合、最初の質問に答えるには、はい、最もきれいに見えるものを使用してください。

于 2008-08-22T16:37:44.857 に答える
0

パフォーマンスに関しては、foreach は for より消費量が多い

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

于 2008-08-22T16:38:39.363 に答える
0

各ループ構造は、異なる目的を果たします。

for - これは、特定の回数だけループするために使用されます。

foreach - コレクション内のすべての値をループするために使用されます。

while - これは、条件を満たすまでループするために使用されます。

3 つのうち、"while" は、ほとんどの状況で最高のパフォーマンスを提供する可能性が最も高いです。もちろん、次のようなことを行うと、基本的に "for" ループを書き直すことになります (C# の方がパフォーマンスがわずかに優れています)。

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

これらはすべて異なる基本的な目的を持っていますが、ある程度同じように使用することもできます。それは、解決しようとしている特定の問題に完全に依存します。

于 2008-08-22T16:50:34.123 に答える