PHP Foreach Pass by Reference: 最後の要素重複の謎が明らかに
次の PHP コードを考えてみましょう:
$arr = ["foo", "bar", "baz"]; foreach ($arr as &$item) { /* do nothing by reference */ } print_r($arr); foreach ($arr as $item) { /* do nothing by value */ } print_r($arr);
実行すると、元の配列 $arr が予期せず変更され、次のような結果になります。出力:
Array ( [0] => foo [1] => bar [2] => baz ) Array ( [0] => foo [1] => bar [2] => bar )
動作を理解する
最初の foreach ループの後、変数 $item は $arr[2] と同じメモリ位置への参照のままになります。 。したがって、引数を値で渡す 2 番目の foreach ループの各反復では、参照された値 (したがって $arr[2]) が新しい反復の値に置き換えられます。
詳細な説明
最初のループ:
最初のループの終わりでも、$item はまだ次を指しています。 $arr[2].
2 番目のループ:
明確化誤解
この動作はバグとはみなされません。これは、PHP の参照の意図された動作と一致しています。ループの外で次の構文を使用した場合にも、同様の結果が観察されます。
for ($i = 0; $i < count($arr); $i++) { $item = $arr[$i]; }
結論
PHP で参照を操作する場合、次のことを認識することが重要です。参照された変数を通じて行われた変更は、元の値にも影響します。この動作は、望ましい結果に応じて効果的に活用することも、回避することもできます。
以上が参照渡しで foreach ループを使用すると、PHP 配列の最後の要素が重複するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。