PHP Foreach 参照渡しの謎: 謎の最後の要素の重複
PHP で、 pass-by を使用して foreach ループを使用すると、参照割り当て (例: foreach ($arr as &$item)) を使用すると、予期しない動作が発生する可能性があります。この複雑な例を考えてみましょう:
$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 has inexplicably changed
このコードの出力:
Array ( [0] => foo [1] => bar [2] => baz ) Array ( [0] => foo [1] => bar [2] => bar )
重複の説明
最初の foreach ループの後、各要素$arr のは引き続き $item によって参照されます。 2 番目のループが反復されると、各要素の値が $item の値 (配列の最後の要素) に置き換えられます。これは、$arr の各要素が $arr[2] の値に設定され、出力の最後の要素が重複することを意味します。
出力のデバッグ
この動作を説明するために、各 foreach に print ステートメントを追加して出力をデバッグしてみましょうiteration:
foreach ($arr as &$item) { echo "Item: $item<br>"; print_r($arr); echo "<br>"; } foreach ($arr as $item) { echo "Item: $item<br>"; print_r($arr); echo "<br>"; }
この出力:
Item: foo Array ( [0] => foo [1] => bar [2] => baz ) Item: bar Array ( [0] => foo [1] => bar [2] => baz ) Item: baz Array ( [0] => foo [1] => bar [2] => baz ) Item: foo Array ( [0] => foo [1] => bar [2] => foo ) Item: bar Array ( [0] => foo [1] => bar [2] => bar ) Item: bar Array ( [0] => foo [1] => bar [2] => bar )
$arr の各要素が $item の値に設定され、それが $item の最後の要素に変更されることが明確にわかります。 2 番目の foreach ループ中の配列。
バグまたは意図されたもの動作?
この動作はバグではありません。これは参照渡しの結果です。 foreach ループは、現在の要素の値をループ ヘッダーで指定された変数に割り当てるだけです。この場合、$item を参照することで、2 番目のループで元の配列要素を変更しています。これは次のコードと同等です:
for ($i = 0; $i < count($arr); $i++) { $arr[$i] = $item; }
したがって、観察された動作はバグではなく、PHP の参照渡しの意図されたセマンティクスの結果です。このような動作を回避するには、各要素の値を $item: foreach ($arr as $item) に割り当てるだけで、2 番目の foreach ループで値渡しを使用します。
以上がPHP の参照渡しの Foreach ループで最後の要素が重複するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。