ホームページ > バックエンド開発 > PHPチュートリアル > PHP の foreach 参照の落とし穴について話しましょう

PHP の foreach 参照の落とし穴について話しましょう

WBOY
リリース: 2016-06-23 13:35:57
オリジナル
1060 人が閲覧しました

まず次のコードを見てみましょう:

<?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造成影响。
ログイン後にコピー

これは、プロジェクトで最近発生した落とし穴と解決策の概要です。エラーやより良い提案がある場合は、指摘してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート