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 サイトの他の関連記事を参照してください。