PHP の「foreach」ループで参照渡しを使用すると、ループ終了後に配列が変更されるのはなぜですか?

Susan Sarandon
リリース: 2024-11-13 09:19:02
オリジナル
397 人が閲覧しました

Why does using pass-by-reference in a PHP `foreach` loop modify the array after the loop ends?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート