ホームページ > バックエンド開発 > PHPチュートリアル > PHP の参照を含む Foreach ループが最後の配列要素を上書きするのはなぜですか?

PHP の参照を含む Foreach ループが最後の配列要素を上書きするのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-27 14:37:14
オリジナル
325 人が閲覧しました

Why Does PHP's Foreach Loop with References Overwrite the Last Array Element?

参照を使用した Foreach ループの予期しない動作

参照を使用して PHP の foreach ループを使用すると、次のコード スニペットに示すように、奇妙な動作が発生する可能性があります。 :

$a = array('a', 'b', 'c', 'd');

foreach ($a as &$v) { }
foreach ($a as $v) { }

print_r($a);
ログイン後にコピー

このコードは配列を反復処理することを目的としています$a は、最初のループで参照変数 $v を使用し、2 番目のループで非参照変数 $v を使用します。しかし、驚くべきことに、出力では配列の最後の要素 'd' が上書きされたことが示されています。

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => c
)
ログイン後にコピー

動作の説明

これは予期せぬものですこの動作については、PHP のドキュメントに詳しく記載されています。 foreach ループで参照を使用する場合、ループが終了した後も配列の最後の要素の参照が残ることを警告します。この問題を回避するには、unset() を使用して参照変数の設定を解除することをお勧めします。

この例では、参照変数 $v は、最初のループの後も $a の最後の要素への参照のままです。 2 番目のループが $a を反復するとき、ループの反復ごとに値が $v に再割り当てされます。ただし、$v は $a の最後の要素への参照であるため、その要素の値が上書きされます。

動作のステップバイステップ ガイド

さらに明確にするために、コード スニペットで何が起こるかを段階的に説明します。

  1. 最初の foreachループは各配列要素の参照を $v に割り当てます。
  2. 2 番目の foreach ループでも、$v は $a の最後の要素 'd' を参照します。
  3. ループは $ を反復します。 a、各値を $v に再割り当てします。
  4. $v は $a の最後の要素への参照なので、その要素の値をそれぞれの値で上書きします。
  5. $a の最後の要素は、前の要素の値で上書きされてしまいます。

解決策

回避するにはこの問題では、最初のループの後で参照変数 $v の設定を解除するだけです:

foreach ($a as &$v) { }
unset($v);
foreach ($a as $v) { }
ログイン後にコピー

以上がPHP の参照を含む Foreach ループが最後の配列要素を上書きするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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