以下のコードを見てください
$ ARR1 = [1、2 ]。 foreachの($ ARR1 => $キーと $値){ $値 = $値 + 1 。 } のvar_dump($キー、$値)。//结果输出1,3
説明:ループが終了したときに上記のforeachループでは、一時的な変数$キーと$ value変数が自動的に解放されることはありません。値が保存されます。しかし、この時点では変更は$ valを$ ARRの値には影響を与えません。
$キー、$値:原理を理解するforeach、上記の結果は、foreachループは、各ループは一時変数に `$ arr1`要素の値をコピーする際に、理解しやすいです。例えば、最初の繰り返しで、次のよう
$キー = 0 ; $値 = $ ARR1 [0]。
また、第2サイクルは、次の通り
$キー = 1 ; $値 = $ ARR1 [1]。
ルックforach使用リファレンス
引用:あなたは、彼らは、配列を横断する配列の要素を変更したい場合は、内のforeach $ valをへの参照を使用することができます。このとき、$ valが共有メモリアドレスの期間である現在のメモリアドレスに配列要素点の要素を参照します。値$ ARR [$キー]の値を変化させながら$ヴァルは、このように修飾されました。
ARR1 $ = [1、2 ]; foreachの(ARR1の$ AS $キー => $値){ $値 = $値 + 1 ; } のvar_dump($キー、$値); //結果出力1,3
のvar_dump($ ARR1の);
ARR1の$値[ '0' => 2、 '1' => 3]
説明:$キー、値と同じの非引用された例$値以上。foreachのの終わりには、$キーと$ valの変数が自動的に解放されることはありませんとき、中&参照のforeachを使用しますが、この時点では$ valのARR $の後に1 - COUNT($ ARR)同じメモリアドレスにポイント。したがって、このときの$ valを変更された値でも$のARR [3]の値を変更します。
foreachの見積もり、上記の原理とは、しかし、元として参照コピーは、ある場合
最初のサイクル: $キー = 0 ; $値 =&ARR1の$ [0 ]; 第二サイクル: $キー = 1 ; $値 =&ARR1の$ [1];
例を見てください:
$ ARR1 = [1、2]。 foreachの($ ARR1 $キー=>&$値として){ $値= $値+ 1。 } のvar_dump($ ARR1)。 = 100 $値。 var_dump($ ARR1)。
また、第2の出力の$ ARR1、第二の要素の値は100です。
あなたがピットを知って、原則を理解します。我々は2つのforeachループを使用している場合は、同じ一時的な変数を使用すると、問題、foreachの時間での参照の使用となります。
以下のような:
ARR1 $ = [1、2 ]; foreachの($ ARR1の AS $キー =>&$値){ $値 = $値 + 1 ; }
//この時間$値に=&$ ARR1 [1 ]、 $値は、バック変更します値は$ ARR1 [1]要素の値を変更します。 ARR2は$である = [10、20、30である]; foreachの($ ARR2は AS $値){ のvar_dump(ARR1の$ ); }
我々は、ARR1 $の最後の要素の値も変化しながら周期の$ ARR2、$要素値にコピー$ ARR2は、その後、ポインタ値が$ ARR2に等しい場合、この時点で対応する要素であることを見出しました。順次最後の要素$ ARR1の最後の値= $ ARR2要素を押してください。
溶液、異なる一時変数を使用する場合解除()解放要素または第2のループ配列を使用して
$ ARR1 = [1、2 ]。 foreachの($ ARR1 として $キー =>&$値){ $値 = $値 + 1 。 } 解除($値)。 $ ARR2 = [10、20、30 ]。 foreachの($ ARR2 として $値){ のvar_dump($ ARR1 )。 }