ホームページ >バックエンド開発 >PHPチュートリアル >PHP の参照渡し (&) を使用した foreach が配列要素を予期せず変更するのはなぜですか?

PHP の参照渡し (&) を使用した foreach が配列要素を予期せず変更するのはなぜですか?

DDD
DDDオリジナル
2024-12-11 04:41:09418ブラウズ

Why does PHP's foreach with pass-by-reference (&) change array elements unexpectedly?

Foreach での PHP 参照渡し

PHP では、変数は通常の変数または参照変数のいずれかになります。変数の参照を別の変数に割り当てると、後者は参照変数となり、基本的に元の変数と同じメモリ位置にバインドされます。この動作は、参照渡し構文 (&) で foreach ループを使用する場合に影響します。

次のコードを考えてみましょう。

$a = ['zero', 'one', 'two', 'three'];

foreach ($a as &$v) {

}

foreach ($a as $v) {
  echo $v . PHP_EOL;
}

このコードの出力は次のとおりです。

zero one two two

なぜこれが起こるのですか?

最初の foreach ループでは、$a の各要素は次のようになります。変数 $v への参照として割り当てられます。これは、$v を変更すると、$a 内の対応する要素も変更されることを意味します。

具体的には、最初のループの最後の反復中に、$v には $a[3] の値が割り当てられます (つまり、'三つ')。ただし、この割り当てにより参照関係が作成されるため、$a[3] は参照変数になります (& を使用して明示的に割り当てられていない場合でも)。

2 番目の foreach ループでは、$ 内の要素の値がが印刷されます。ただし、$a[3] は参照変数になっているため、その値は $v の値とともに変化します。 3 回目の反復中に $v に値 'two' が割り当てられると、$a[3] も 'two' になります。

その結果、最後の反復では $v (これはまだ $a を指します) [3]) の値は 'two' であり、'two' が出力されます。これは、直感的に予想される「three」を出力するのではなく、最後の反復で「two」が繰り返される理由を説明しています。

以上がPHP の参照渡し (&) を使用した foreach が配列要素を予期せず変更するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。