ホームページ > バックエンド開発 > PHPチュートリアル > PHP の「foreach」ループで参照を使用すると、予期しない配列変更が発生するのはなぜですか?

PHP の「foreach」ループで参照を使用すると、予期しない配列変更が発生するのはなぜですか?

Linda Hamilton
リリース: 2024-12-16 09:24:17
オリジナル
384 人が閲覧しました

Why Does Using References in PHP's `foreach` Loop Lead to Unexpected Array Modifications?

'foreach' ループでの参照動作: 配列の変更を理解する

PHP では、'foreach' ループ内で参照を使用すると、予期しないエラーが発生する可能性があります配列の変更。この動作は次のコードで強調表示されています:

$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
)
ログイン後にコピー

ステップバイステップの説明

この動作を理解するには、「foreach」の各反復中に発生する変更を追跡することが不可欠です。ループ:

  • 最初の反復 (参照反復): $v は $a[0] ('a') への参照です。
  • 2 回目の反復 (参照反復): $v は $a[1] への参照です('b').
  • 3 回目の反復 (参照反復): $v は $a[2] ('c') への参照です。
  • 4 回目の反復 (参照反復): $v は $a[3] への参照です('d').

最初の 'foreach' ループ (参照の反復) が完了しても、$v は $a[3] ('d') への参照を保持しています。

  • 最初の反復 (値の反復): $v (まだ $a[3] を参照) には、次の値が割り当てられます。 $a[0] ('a')。ただし、$v は参照であるため、$a[3] を 'a' に変更します。
  • 2 番目の反復 (値の反復): $v (まだ $a[3] を参照しています) ) には $a[1] ('b') の値が割り当てられます。これにより、再び $a[3] が 'b' に変更されます。
  • 3 回目の反復 (値の反復): $v (まだ $a[3] を参照) には、$a の値が割り当てられます。 [2] ('c')。これにより、$a[3] がもう一度 'c' に変更されます。
  • 4 回目の反復 (値の反復): $v (まだ $a[3] を参照) には、$ の値が割り当てられます。 a[3] ('c').

したがって、2 番目の 'foreach' ループ (値の反復) の後、配列 $a は、'c' が 2 回出現するように変更されています。

問題の解決

この予期しない動作を回避するには、反復ごとに参照の設定を解除することをお勧めします。 :

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

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

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

これにより、期待される出力が得られます:

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

以上がPHP の「foreach」ループで参照を使用すると、予期しない配列変更が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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