foreach は (配列をコピーすることによって) 配列のコピーを操作しますが、while は配列の内部インデックスを移動することによって操作します (foreach は開始時に最初に配列をコピーするため、一般的に) while の方が高速であると考えられています。実行中、および 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 。 '...';
}
while (list($key) = each($array)) {
$array[$key] = $array[$key] . ;
}
概要: 一般に、foreach には値のコピーが含まれるため、while よりも時間がかかると考えられていますが、実際には、ループ内で配列の読み取り操作のみを実行する場合、foreach は非常に
高速です。これは、PHP で使用されるコピー メカニズムが「参照カウント、コピーオンライト」であるためです。つまり、変数が PHP でコピーされたとしても、実際には初期形式がそのまま残っているからです。変数の実際のコピーは、内容が変更された場合にのみ行われます。これを行う理由は、メモリ消費を節約し、
コピーの効率を向上させるためです。この観点から見ると、foreach の効率的な読み取り操作を理解するのは難しくありません。さらに、foreach は配列書き込み操作の処理には適していないため、ほとんどの場合、foreach ($array as $key => $value) 形式の配列書き込み操作のコードを置き換える必要があると結論付けることができます。 while (list($key) =
each($array)) によって。これらの手法によって生じる速度の違いは、小規模なプロジェクトでは明らかではないかもしれませんが、1 つのリクエストに数百、数千、数千万の配列ループ操作が含まれることが多いフレームワークのような大規模なプロジェクトでは、その違いは明らかです。