まず次のコードを見てみましょう:
<?php $arr = array('apple','banana','cat','dog'); foreach($arr as $key=>$val) { //some code } echo $val; //输出dog echo $key; //输出3 //下面对val进行赋值 $val = 'e'; print_r($arr); //输出Array ( [0] => apple [1] => banana [2] => cat [3] => dog )
注: 上記の foreach ループでは、ループが終了すると、$key 変数も $val 変数も自動的に解放されません。値が保存されます。また、この時点で $val の値を変更しても $arr には影響しません。
参考: 配列の走査中に配列の要素を変更したい場合は、foreach で $val への参照を使用できます。このとき、参照される要素 $val は、現在の配列要素のメモリ アドレス、つまり共有メモリ アドレスを指します。したがって、$val の値を変更すると、$arr[$key] の値も変更されます。
foreach で参照を使用する次のコードを見てみましょう。これは私がプロジェクトで最近遭遇した状況です:
<?php $arr = array('apple','banana','cat','dog'); //在foreach中使用引用 foreach($arr as $key => &$val) { $val = 'new value'; } echo $val; //输出new value echo $key; //输出3 $val = 'egg'; print_r($arr); //输出Array ( [0] => new value [1] => new value [2] => new value [3] => egg )
注: foreach で & 参照を使用した後、foreach が終了すると、$key と $ val 変数は自動的には解放されませんが、この時点では $val と $arrcount($arr) - 1 は同じメモリ アドレスを指します。したがって、この時点で $val の値を変更すると、$arr[3] の値も変更されます。
この場合に犯しやすい間違いは、上記の例に示すように、ループの外側で foreach によって参照される変数を使用し続けることです。これにより、開発者は期待したデータを取得できなくなります。したがって、このような事態を避けるためには、適切な場所で変数への参照を解放する必要があります。上記のコードを例に挙げます。
<?php $arr = array('apple','banana','cat','dog'); //在foreach中使用引用 foreach($arr as $key => &$val) { $val = 'new value'; } unset($val); echo $val; //报错,Notice: Undefined variable: val echo $key; //输出3 $val = 'egg'; print_r($arr); //输出Array ( [0] => new value [1] => new value [2] => new value [3] => new value ) 在foreach结束后unset $val,此时会释放对$val的引用。因此改变$val不会对$arr造成影响。
これは、プロジェクトで最近発生した落とし穴と解決策の概要です。エラーやより良い提案がある場合は、指摘してください。