ホームページ  >  記事  >  バックエンド開発  >  PHPでのforeach()の使用法とwhileとのパフォーマンスの比較

PHPでのforeach()の使用法とwhileとのパフォーマンスの比較

伊谢尔伦
伊谢尔伦オリジナル
2017-06-23 11:42:401180ブラウズ

PHP 4 では、Perl や他の言語と同様に、foreach コンストラクトが導入されました。これは、配列を反復処理するための単なる便利な方法です。 foreach は配列でのみ使用でき、他のデータ型や初期化されていない変数で使用しようとするとエラーが生成されます。 2 つの構文があり、2 番目の構文は重要度は低いですが、最初の構文を拡張したものです。

foreach (array_expression as $value)
    statement
foreach (array_expression as $key => $value)
    statement

最初の形式は、指定された array_expression 配列を反復処理します。 各ループでは、現在のセルの値が $value に割り当てられ、配列内のポインターが 1 ステップ前に進みます (つまり、次のループで次のセルが取得されます)。
2 番目の形式でも同じことを行いますが、現在のセルのキー名が各ループの変数 $key にも割り当てられる点が異なります。
PHP 5 以降では、オブジェクトを反復することも可能です。
注:
foreach の実行が開始されると、配列内のポインターは自動的に最初のユニットを指します。これは、foreach ループの前にreset()を呼び出す必要がないことを意味します。
注:
配列が 参照 されていない限り、foreach は配列自体ではなく、指定された配列のコピーを操作します。 foreach は配列ポインターにいくつかの副作用をもたらします。リセットされない限り、foreach ループ中またはループ後に配列ポインターの値に依存しないでください。
PHP 5 以降では、$value の前に & を追加することで配列の要素を簡単に変更できます。このメソッドは、値をコピーするのではなく、参照によって割り当てます。

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
?>

このメソッドは、走査される配列が参照できる場合 (たとえば、変数である場合) にのみ使用できます。

<?php
foreach (array(1, 2, 3, 4) as &$value) {
    $value = $value * 2;
}
?>

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

foreach ($array as $value) { 
echo $value; 
} 
while (list($key) = each($array)) { 
echo $array[$key]; 
}

ループ内では、配列の「書き込み」操作が実行され、while は foreach より高速です:

foreach ($array as $key => $value) { 
echo $array[$key] = $value . &#39;...&#39;; 
} 
while (list($key) = each($array)) { 
$array[$key] = $array[$key] . &#39;...&#39;; 
}

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

以上がPHPでのforeach()の使用法とwhileとのパフォーマンスの比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。