ホームページ > バックエンド開発 > PHPチュートリアル > PHP Foreach ループで参照を使用すると要素値が繰り返されるのはなぜですか?

PHP Foreach ループで参照を使用すると要素値が繰り返されるのはなぜですか?

DDD
リリース: 2024-12-15 07:29:13
オリジナル
538 人が閲覧しました

Why Does Using a Reference in a PHP Foreach Loop Lead to Repeated Element Values?

Foreach 内で参照を使用すると、配列内で要素の値が繰り返されるのはなぜですか?

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

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

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

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

驚くべきことに、出力では、最後の要素の値が他の要素の値の結果:

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

奇妙な点の説明

この動作は、参照 (&) の使用に起因する PHP の文書化された側面です。

最初のループでは、配列の各要素が参照によって $v に割り当てられます。 $v が変更されると、元の配列内の参照要素が変更されます。そのため、後続のループで $v が再割り当てされると、参照に対応する配列要素が誤って変更されてしまいます。

解決策

この問題を回避するには、明示的に2 番目の foreach ループの前の最後の要素への参照:

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

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

理解段階的なプロセス

コード内で何が起こるかを段階的に説明します:

  • 最初の foreach ループ:

    • 反復 1: $v は $a[0] への参照です('a')
    • 反復 2: $v は $a[1] への参照 ('b')
    • 反復 3: $v は $a[2] への参照('c')
    • 反復 4: $v は $a[3] への参照です('d')
  • 最初のループの終わりでも、$v は $a[3] を参照しています ('d')。
  • 2 番目foreach ループ:

    • 反復 1: $v は $a[3] への参照として残りますが、その値は$a[0] ('a') に設定します。これにより、$a[3] が 'a' に変更されます。
    • 反復 2 ~ 4: 後続の反復ではこのプロセスが繰り返され、$a[3] が $a[1] ('b') の値で上書きされます。 $a[2] ('c')、最後に $a[3] ('c')。

以上がPHP Foreach ループで参照を使用すると要素値が繰り返されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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