質問
これは PHP に関するものですが、同じコメントの多くが他の言語にも当てはまることは間違いありません。
簡単に言えば、PHP のさまざまなタイプのループの違いは何でしょうか?1 つは他のものより速い/優れているのでしょうか、それとも単純に最も読みやすいループを挿入する必要がありますか?
for ($i = 0; $i < 10; $i++)
{
# code...
}
foreach ($array as $index => $value)
{
# code...
}
do
{
# code...
}
while ($flag == false);
解決
For ループと While ループは開始条件ループです。最初に条件を評価するため、条件が満たされない場合、ループに関連付けられたステートメント ブロックは一度も実行されません。
この 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マニュアル あなたの友だちです :)
他のヒント
これは CS101 ですが、誰も言及していないので、while ループはコード ブロックの前に条件を評価し、do-while はコード ブロックの後に評価します。そのため、do-while ループは常にコード ブロックを少なくとも 1 回実行することが保証されます。状態を問わず。
@ブレンダン:
あなたが引用した記事はかなり古く、情報はまったく間違っています。特に最後の点(使用 for
の代わりに foreach
) は誤解を招くものであり、この記事で提供されている正当な理由は、最新バージョンの .NET には適用されなくなりました。
それは事実ですが、 IEnumerator
仮想通話を使用します。 できる 実際には最新のコンパイラによってインライン化されます。さらに、.NET はジェネリックスと厳密に型指定された列挙子を認識できるようになりました。
ということを決定的に証明するパフォーマンス テストがたくさんあります。 for
一般的には以下より速くありません foreach
. ここに例があります.
従来の (インデックス付き?) 配列を反復処理する場合は最初のループを使用し、連想配列を処理する場合は foreach ループを使用します。私の意見では、これは自然であり、コードの流れが良くなり、読みやすくなります。do...while ループに関しては、単に配列を反転する以上のことを行う必要がある場合に使用します。
ただし、パフォーマンス上の利点はわかりません。
どちらの場合もパフォーマンスが大幅に向上するわけではありません。While は反復よりも複雑なタスクに役立ちますが、 for
そして while
機能的には同等です。
Foreach
これは素晴らしいことですが、重要な注意点が 1 つあります。あなた 変更できません 反復している列挙型。したがって、エントリを削除、追加、または置換することはできません。もちろん、エントリの変更 (プロパティの変更など) は問題ありません。
foreach ループでは、元の配列のコピーがメモリ内に作成され、内部で使用されます。大規模な構造物には使用しないでください。単純な for ループを使用することをお勧めします。次のように、大規模な非数値インデックス構造に対して while ループをより効率的に使用できます。
while(list($key, $value) = each($array)) {
しかし、このアプローチは、単純な小さな構造の場合、特に醜いものになります。
while ループは、ストリームをループする場合や、PHP で頻繁に見られる次の例のように、ループする場合に適しています。
while ($row = mysql_fetch_array($result)) {
ほとんどの場合、異なるループは交換可能であり、最終的には a) 効率か、b) 明瞭さのどちらかになります。
さまざまなタイプのループの効率のトレードオフを知っている場合は、元の質問に対する答えは「はい」です。最もきれいに見えるものを使用してください。
各ループ構造は異なる目的を果たします。
for - これは、特定の反復回数だけループするために使用されます。
foreach - コレクション内のすべての値をループするために使用されます。
while - 条件を満たすまでループするために使用されます。
3 つのうち、ほとんどの状況で最高のパフォーマンスが得られるのは「while」です。もちろん、次のようなことを行う場合は、基本的に「for」ループを書き換えることになります (C# ではパフォーマンスがわずかに向上します)。
$count = 0;
do
{
...
$count++;
}
while ($count < 10);
基本的な目的はすべて異なりますが、ある程度同じように使用することもできます。それは、解決しようとしている特定の問題によって完全に異なります。
foreach ループでは、元の配列のコピーがメモリ内に作成され、内部で使用されます。
Foreach は優れていますが、重要な注意点が 1 つあります。反復している列挙型を変更することはできません。
値ではなく参照によって渡す場合、これらはどちらも問題になりません。
foreach ($array as &$value) {
これはPHP 5から許可されていると思います。
配列の要素にアクセスするときは、わかりやすくするために、可能な限り foreach を使用し、実際のインデックス値 (たとえば、複数の配列内の同じインデックス) が必要な場合にのみ for を使用します。また、for ループを使用するとこれが非常に簡単になるため、タイプミスの可能性も最小限に抑えられます。一般に、PHP はパフォーマンスについてあまり心配する必要はないかもしれません。そして最後になりましたが、for と foreach は持っています (または持つべきです;私は PHP 専門家ではありません) 同じ Big-O 時間 (O(n)) なので、メモリ使用量が少し増えるか、時間内にわずかな一定または線形のヒットが発生する可能性があります。
パフォーマンスに関しては、foreach は for よりも消費量が多くなります。