ホームページ >バックエンド開発 >PHPチュートリアル >php_PHP チュートリアルの foreach ループと while ループの違いの比較

php_PHP チュートリアルの foreach ループと while ループの違いの比較

WBOY
WBOYオリジナル
2016-07-13 17:16:041226ブラウズ

Foreach と while ループはどちらも PHP でループします。では、foreach と while ループの違いは何ですか? どちらの方がパフォーマンスが優れていますか? ここで、知る必要がある人のために、foreach と while ループの違いとパフォーマンスの比較を紹介します。参照可能です。

while ループでは、Perl は入力行を読み取り、それを変数に格納し、ループの本体を実行します。次に、他の入力行を探しに戻ります。

foreach ループでは、入力演算子の行全体がリスト コンテキストで実行されます (foreach はリストの内容を 1 行ずつ処理する必要があるため)。ループは実行を開始する前に、すべての入力を読み取る必要があります。

大容量のファイルを入力する場合、foreachを使用すると多くのメモリを占有します。両者の違いは非常に明らかです。したがって、最善のアプローチは、通常、while ループの省略表現を使用して、一度に 1 行ずつ処理させることです。

ここにいくつかの情報があります:

特定のステートメントまたは段落を繰り返し実行する場合、C# には現在のタスクに応じて使用できる 4 つの異なるループ ステートメント オプションが用意されています。 。ステートメント
。 foreach ステートメント
。 while ステートメント
。 do ステートメント

1.for

for ステートメントは、含まれるステートメントを何回実行する必要があるかが事前にわかっている場合に特に便利です。通常の構文では、条件が true の間、内部ステートメント (およびループ式) を繰り返し実行できます。

for (初期化; 条件; ループ) にはステートメントが含まれます

初期化、条件、ループはすべてオプションであることに注意してください。条件を省略すると、終了するためにジャンプ ステートメント (break または goto) を必要とする無限ループが作成される可能性があります。

コードは次のとおりですのために(;;)もう 1 つの重要な点は、カンマで区切られた複数のステートメントを for ループの 3 つのパラメーターすべてに同時に追加できることです。たとえば、2 つの変数を初期化し、3 つの条件を指定し、4 つの変数を繰り返すことができます。
コードをコピー
{

休憩; // 何らかの理由で
}

2.foreach

Visual Basic 言語に長い間組み込まれている機能は、For Each ステートメントを使用して列挙を収集する機能です。 C# には、foreach ステートメントを通じて列挙を収集するコマンドもあります。

foreach (式内の型識別子) を含むステートメント

ループ変数は型と識別子によって宣言され、式はコレクションに対応します。ループ変数は、ループが実行されているコレクション要素を表します。

3.ながら

囲まれたステートメントを 0 回以上実行したい場合、while ステートメントがまさにあなたが探しているものです:

while (条件) にはステートメントが含まれています

条件ステートメント (これもブール式) は、含まれているステートメントが実行される回数を制御します。 Break ステートメントと continue ステートメントを使用すると、while ステートメント内のステートメントの実行を制御できます。これは、for ステートメントとまったく同じように動作します。

4、してください

C# で使用できる最後のループ ステートメントは do ステートメントです。最初のループの後にのみ条件が検証されるという点で、while ステートメントと非常によく似ています。

コードは次のとおりですやります

do ステートメントは、含まれているステートメントが少なくとも 1 回実行されていることを保証し、条件が true と評価される限り実行され続けることを保証します。 Break ステートメントを使用すると、実行を強制的に do ブロックから抜け出すことができます。このループをスキップしたい場合は、 continue ステートメントを使用します。


パフォーマンスの比較

foreach は (配列をコピーすることによって) 配列のコピーを操作しますが、while は配列の内部インデックスを移動することによって操作します (foreach は、配列をコピーするときに最初に配列をコピーするため)。は実行を開始し、while は内部インジケーターを直接移動します)。しかし、結果はまったく逆になります。
ループ内で行われるのは配列の「読み取り」操作であるため、foreach は while よりも高速です。

コードをコピー
{

文章が含まれています
}
while (条件);

コードは次のとおりですコードをコピーforeach ($array as $value) {
$値をエコーする
}
while (list($key) = each($array)) {
エコー $array[$key]
}
配列の「書き込み」操作はループ内で実行されるため、while は foreach よりも高速です。

コードは次のとおりですforeach ($array as $key => $value) { エコー $array[$key] = $value まず、50,000 個の添字を持つ 1 次元配列を走査するのにかかる時間をテストしてみましょう:
コードをコピー
; }
while (list($key) = each($array)) {
$array[$key] = $array[$key] .'; }


テストプラットフォーム:
CPU:P-M725

メモリ: 512M

ハードドライブ: 40G 5400 rpm
OS: Windows XP SP2
WEB: apache 2.0.54 php5.0.4

テストコード:

コードは次のとおりですコードをコピー /*
* @ 作者: リロフ

* @ ホームページ: www.bKjia.c0m
* @メール:zhongjiechao@gmail.com
*
*/

$arr = 配列();
for($i = 0; $i <50000; $i++){

$arr[] = $i*rand(1000,9999);

}

関数 GetRunTime()
{

list($usec,$sec)=exp lode(" ",microtime());

return ((float)$usec+(float)$sec);
}
#####################################
$time_start = GetRunTime();

for($i = 0; $i $str .= $arr[$i];

}


$time_end = GetRunTime();
$time_used = $time_end - $time_start;

echo '使用時間:'.round($time_used, 7).'(s)

';
unset($str, $time_start, $time_end, $time_used); #####################################

$time_start = GetRunTime();

while(list($key, $val) = each($arr)){
$str .= $val;

}


$time_end = GetRunTime();
$time_used = $time_end - $time_start;

echo 'その間の使用時間:'.round($time_used, 7).'(s)

';

unset($str, $key, $val, $time_start, $time_end, $time_used);

#####################################

$time_start = GetRunTime();


foreach($arr as $key => $val){
$str .= $val;

}


$time_end = GetRunTime();
$time_used = $time_end - $time_start;

echo 'foreach の使用時間:'.round($time_used, 7).'(s)

';

#####################################

?>

テスト結果:

3 つのテスト結果を平均します:
それぞれfor、while、foreachに対応します
0.1311650
0.1666853
0.1237440

テストを繰り返した結果、同じ配列を走査する場合、foreach が最も速く、while が最も遅いことがわかりました。 foreach は while よりも約 20% ~ 30% 高速です。次に、配列の添え字を 500000 と 5000000 に追加しますが、テスト結果は同じです。しかし、原理的な観点から見ると、foreach は (配列をコピーすることによって) 配列のコピーを操作しますが、while は配列の内部インデックスを移動することによって操作します。一般的に、while は foreach よりも高速であると考えられています。 foreach は最初に配列がコピーされ、while は内部ポインタを直接移動します) を実行しますが、結果はまったく逆になります。その理由は、foreach が PHP の内部実装であるのに対し、while は一般的なループ構造であるためです。


概要: 一般に、foreach は値のコピーを必要とするため、while よりも遅いと考えられていますが、実際には、ループ内で配列を読み取るだけの場合、foreach は非常に高速です。これは、PHP で使用されるコピー メカニズムによるものです。それは「参照カウント、コピーオンライト」、つまり、PHP で変数がコピーされても、基本的には初期形式のままであり、変数の内容が変更される場合にのみ変わります。実際のコピーはメモリ消費を節約するために行われ、コピーの効率も向上します。この観点から見ると、foreach の効率的な読み取り操作を理解するのは難しくありません。さらに、foreach は配列書き込み操作の処理には適していないため、ほとんどの場合、foreach ($array as $key => $value) 形式の配列書き込み操作のコードは while に置き換える必要があるという結論を導き出すことができます。 (リスト($key) = each($array))。これらの手法によって生じる速度の違いは、小規模なプロジェクトでは明らかではないかもしれませんが、フレームワークのような大規模なプロジェクトでは、1 つのリクエストに数百、数千、数万の配列ループ操作が含まれることが多く、その差は大幅に拡大します。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/628743.html技術記事 phpではforeachとwhileループの両方がありますが、foreachとwhileループの違いは何ですか?foreachとwhileループの違いを紹介します...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。