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

参照渡しを使用した PHP foreach ループによって配列が予期せず変更されるのはなぜですか?

Barbara Streisand
リリース: 2024-11-13 10:54:02
オリジナル
575 人が閲覧しました

Why does my PHP foreach loop with pass-by-reference change my array unexpectedly?

PHP Foreach 参照渡し: 最後の要素が重複していますか? (バグ?)

問題の理解

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

$arr = array("foo", "bar", "baz");

foreach ($arr as &$item) {}
print_r($arr);

foreach ($arr as $item) {}
print_r($arr); // $arr has changed to ["foo", "bar", "bar"]
ログイン後にコピー

最初のループの後、配列は期待どおりに出力されます:

Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)
ログイン後にコピー

しかし、2 番目のループの後、配列は予期せず変更されます:

Array
(
    [0] => foo
    [1] => bar
    [2] => bar
)
ログイン後にコピー

説明

問題最初の foreach ループが $item を参照渡しするために発生します。これは、$item が $arr 配列内の要素のエイリアスであることを意味します。最初のループでは、$item または $arr に変更は加えられません。

ただし、2 番目のループでは、$item を値で渡します。ループ内で $item の値に新しい値が割り当てられると、$arr 内の対応する要素も変更されます。

具体的には、$arr の 3 番目の要素 ("baz") が、次の値で上書きされます。 2 番目のループの最後の反復中の 2 番目の要素 (「bar」)。これは、$arr の最後の要素が 2 番目のループの後に重複する理由を説明しています。

Is It a Bug?

いいえ、この動作はバグではありません。これは、参照によって変数を渡すときの foreach ループの意図された動作です。配列の予期しない変更を避けるために、この動作を認識することが重要です。

出力のデバッグ

動作を視覚化しやすくするために、次のコードは echo ステートメントを追加します。ループの各反復後に $item と配列 $arr の値を出力します:

echo "<br>";

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

echo "<br>";

foreach ($arr as $item) {
    echo "Item: $item; Arr: ";
    print_r($arr);
    echo "<br>";
}
ログイン後にコピー

出力は、ループ中に $item と $arr がどのように変化するかを示しており、上記の動作を明確に示しています。

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

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