ホームページ >バックエンド開発 >PHPチュートリアル >PHP の参照渡しの Foreach ループで最後の要素が重複するのはなぜですか?

PHP の参照渡しの Foreach ループで最後の要素が重複するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-16 19:08:02850ブラウズ

Why Does the Last Element Duplicate in PHP's Foreach Loop with Pass-by-Reference?

PHP Foreach 参照渡しの謎: 謎の最後の要素の重複

PHP で、 pass-by を使用して foreach ループを使用すると、参照割り当て (例: foreach ($arr as &$item)) を使用すると、予期しない動作が発生する可能性があります。この複雑な例を考えてみましょう:

$arr = ["foo", "bar", "baz"];

foreach ($arr as &$item) { /* do nothing by reference */ }
print_r($arr);

foreach ($arr as $item) { /* do nothing by value */ }
print_r($arr); // $arr has inexplicably changed

このコードの出力:

Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)
Array
(
    [0] => foo
    [1] => bar
    [2] => bar
)

重複の説明

最初の foreach ループの後、各要素$arr のは引き続き $item によって参照されます。 2 番目のループが反復されると、各要素の値が $item の値 (配列の最後の要素) に置き換えられます。これは、$arr の各要素が $arr[2] の値に設定され、出力の最後の要素が重複することを意味します。

出力のデバッグ

この動作を説明するために、各 foreach に print ステートメントを追加して出力をデバッグしてみましょうiteration:

foreach ($arr as &$item) {
    echo "Item: $item<br>";
    print_r($arr);
    echo "<br>";
}

foreach ($arr as $item) {
    echo "Item: $item<br>";
    print_r($arr);
    echo "<br>";
}

この出力:

Item: foo
Array ( [0] => foo [1] => bar [2] => baz )

Item: bar
Array ( [0] => foo [1] => bar [2] => baz )

Item: baz
Array ( [0] => foo [1] => bar [2] => baz )

Item: foo
Array ( [0] => foo [1] => bar [2] => foo )

Item: bar
Array ( [0] => foo [1] => bar [2] => bar )

Item: bar
Array ( [0] => foo [1] => bar [2] => bar )

$arr の各要素が $item の値に設定され、それが $item の最後の要素に変更されることが明確にわかります。 2 番目の foreach ループ中の配列。

バグまたは意図されたもの動作?

この動作はバグではありません。これは参照渡しの結果です。 foreach ループは、現在の要素の値をループ ヘッダーで指定された変数に割り当てるだけです。この場合、$item を参照することで、2 番目のループで元の配列要素を変更しています。これは次のコードと同等です:

for ($i = 0; $i < count($arr); $i++) {
    $arr[$i] = $item;
}

したがって、観察された動作はバグではなく、PHP の参照渡しの意図されたセマンティクスの結果です。このような動作を回避するには、各要素の値を $item: foreach ($arr as $item) に割り当てるだけで、2 番目の foreach ループで値渡しを使用します。

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

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