PHP Foreach 参照渡しと配列変更
PHP では、foreach ループで参照渡しを使用すると、予期しない動作が発生する可能性があります。次のコードを考えてみましょう:
$arr = ["foo", "bar", "baz"]; foreach ($arr as &$item) {} // Array remains unchanged: ["foo", "bar", "baz"] foreach ($arr as $item) {} // Array is modified: ["foo", "bar", "bar"]
2 番目のループで配列が変更されるのはなぜですか?
最初のループでは、$item 変数が参照によって渡されます。つまり、$item に加えられた変更は、$arr 配列内の対応する要素にも影響します。ただし、2 番目のループでは、$item が値によって渡されます。したがって、$item に加えられた変更は配列には影響しません。
重要なのは、最初のループの後でも、$item は $arr の最後の要素を参照していることです。 2 番目のループが配列に対して反復されると、$item の各値は $arr の最後の要素を上書きします。これらは両方とも同じメモリ位置を参照するためです。
出力のデバッグ
動作を理解するには、$item の現在の値をエコーし、各ループ中に $arr 配列を再帰的に出力します。 iteration.
最初のループ:
foo Array ( [0] => foo [1] => bar [2] => baz ) bar Array ( [0] => foo [1] => bar [2] => baz ) baz Array ( [0] => foo [1] => bar [2] => baz )
最初のループの後、$item は $arr の最後の要素を指します。
2 番目のループ:
foo Array ( [0] => foo [1] => bar [2] => foo ) bar Array ( [0] => foo [1] => bar [2] => bar ) bar Array ( [0] => foo [1] => bar [2] => bar )
の各値として$item は上書きされ、$arr の最後の要素も変更されます。
バグですか?
いいえ、この動作はバグではなく、むしろ意図されたものです参照渡しの動作。変数を参照渡しすることの影響を理解し、それを適切に使用することが重要です。
以上がPHP の「foreach」ループで参照渡しを使用すると、ループ終了後に配列が変更されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。