まず、問題をリードするために次のコードを見てみましょう。
<?PHPの $のARR = [ 'A'、 'B'、 'C'、 'D'、 ]。 foreachの($として&$各ARR){ $各エコー。 } エコーPHP_EOL。 foreachの($ $各としてARR){ $各エコー。 }
このコードは非常にシンプルですが、出力配列の2つの要素が、二回以下の出力を申し訳ありませんABCD出力を感じるだろう?:
私は非常に奇妙な感じていないのですか?私は、ああ、それはときに、第2のサイクルをどのように変化するかを配列の最後の要素を配列の割り当てを与えていませんか?
分析
コードを修正するいくつかの素晴らしいについては、以下を見てみましょう:
<?PHPの $のARR = [ 'A'、 'B'、 'C'、 'D'、 ]。 foreachの($として&$各ARR){ $各エコー。 } エコーPHP_EOL。 各= '1' $; var_dump($のARR)。
それが見つかりませんか?
これが理由で、ARRの最後の要素を変更する各変数を修正しますか?
C言語を使用した経験は、おそらく1が、それが起こるかを理解することができますされてきました。
上記foreachループ、&記号を使用して各変数、アドレスCに匹敵するこのシンボルをよく見
PHPのforeachのは、各サイクルで、現在の要素がそれぞれに割り当てられていると言う、その後、ループの本体に入ります
最後の要素のforeachのトラバーサルが完了すると、各変数は解放されず、配列arrの最後の要素なので、実際には、背面にそれぞれに割り当てられ、変更配列arrにポイント
これは、プロセスは、二回のforeachプロセスの開始時に、次の削減を理解されています:
最初のforeachが完了した後、明らかに、各配列の最後の要素を指し、以下には第二のforeachに入りました。
-
介して、ARR [0]がそれぞれに割り当てられた最初の時、等価ARR [3] = ARR [0]、ARR場合がある:[ 'A'、 'B'、 'C'、 'A']
-
[1]第二のパス、ARRがそれぞれに割り当てられ、等価ARR [3] =のARR [1]、ケースARRのために:[ 'A'、 'B'、 'C'、 'B']
-
第3パス、ARR [2]がそれぞれに割り当てられ、等価ARR [3] = ARR [2]、ARRには、この時間:[ 'A'、 'B'、 'C'、 'C']
-
[3]第四のトラバーサルは、ARRのそれぞれに割り当てられ、等価ARR [3] =のARR [3]、ケースARRとして:[ 'A'、 'B'、 'C'、 'C']
次のように同じ前の解析と結果出力の結果は、我々は第二のforeachコードをプリントアウトする各変更は次のとおりです。
<?PHPの $のARR = [ 'A'、 'B'、 'C'、 'D'、 ]。 foreachの($として&$各ARR){ } foreachの($ ARR $各など){ のvar_dump($のARR)。 }
スクリーンショットの結果、次のように:
分析の結果と完全に一致し、この時点では、私たち、終わり
私が使用したPHPのバージョンは:7.2