この記事は、stackoverflow ウェブサイトの記事「参照によるループ後の奇妙な動作 - これは PHP のバグですか?」から編集されたものです。 PHP ループ内で references を使用すると、非常に奇妙な動作が発生します。これは PHP のバグですか? 質問簡単な PHP スクリプトを書いているときに、非常に奇妙なことが起こりました。以下は私のコードです。私が言いたいことを明確に表現するために、いくつかの不要なコードを意図的に削除しました。
つまり、2 番目のループでは次のようになります: 初めてループを通過すると、$item と $arr[2] の値は $arr[0]、つまり 'foo' になります。 2 番目のループでは、$item と $arr[2] の値が $arr[1]、つまり 'bar' になります。 3 番目のループでは、$item と $arr[2] の値は、「bar」である $arr[2] になります (2 番目のループでは、$arr[2] の値は「baz」ではありません) 「バー」になります)。「baz」の値は実際には 2 番目のループで失われます。 翻訳メモ: 私は、reference を「引用」に訳すのは好きではありません。もちろん、「参照」はおろか。私が誰かにリファレンスを説明するときはいつも、「 リファレンスはエイリアスです」と伝えます。 たとえば、あなたの名前はウー・イーチャン (笑、珍しいものではありません) で、エルゴウジはあなたの別名です。良き兄弟、良き友人の友情の精神で、「さあ、エルグージ、この100元あげましょう。」 あなた - ウー・イーチャン - まったく同じポケットを持って家に帰りますが、100 元追加されます。 @justjavac デバッグ出力 コードを変更して、ループの実行の詳細をデバッグおよびトレースできます。 $item の値を出力し、配列 $arr を再帰的に出力できます。 最初のループが実行されると、次のような出力が表示されます: fooArray ( [0] => foo [1] => bar [2] => baz )
foo
Array ( [0] => foo [1] => bar [2] => foo )
おそらくこのコードは と同等であると思われるかもしれません for ($i = 0; $i < count($arr); $i++) { // 何もしない
for ($i = 0; $i < count($arr); $i++) { } 実際には、それは正しくありません。コードは次と同等である必要があります:
$item = $arr[$i]
}
言い換えると、 foreach ループでは、代入操作は暗黙的であるということだけです。 代入プロセス中に参照を使用したため、最初のループでループ中の配列内の要素を誤って変更してしまいました。 |