私は長年 PHP を書いてきましたが、今でも愚かな間違いを犯しています。PHP のバージョンは 5.6.12 です。
<?php $arr = ['a', 'b', 'c', 'd', 'e']; foreach ($arr as $i=>&$a) { $a = $a.'_'. $a; echo $a .'<br>'; } echo '<hr>'; foreach ($arr as $i=>$a) { echo $a .'<br>'; } echo '<hr>'; print_r($arr);
出力結果
。
冒頭で2番目を見ましたが、foreachの出力結果は非常に不可解に感じますが、どうすれば2つのd_dを出力できるのでしょうか? よく考えてみると、PHP foreach の $a のスコープは関数全体のローカル変数であり、ループ内に囲まれているのではなく、ループの外でもまだ有効であることがわかります。 foreach が実行される $a は新しい変数ではありませんが、$arr 配列の 5 番目の要素のアドレス参照を指します。2 番目の foreach がループすると、実際には $arr 配列の 5 番目の要素が与えられ続けます。
具体的な代入状況、初回: a_a が 5 番目の要素に代入され、結果は次のようになります: [a_a, b_b, c_c, d_d,a_a] 2 回目: b_b が 5 番目の要素に代入、その結果は: [a_a, b_b, c_c, d_d,b_b] 3 回目: c_c が 5 番目の要素に代入され、結果は次のようになります: [a_a, b_b, c_c, d_d,c_c] 4 回目: d_d はassign 5 番目の要素を与えると、結果は [a_a, b_b, c_c, d_d,d_d] になります 5 回目: このとき、5 番目の要素は d_d になっているので、5 番目の要素に d_d が代入され、結果はは同じです: [a_a, b_b, c_c, d_d,d_d]解決策:1. 同じループ変数名を使用しないようにしてください。2. 使用するたびに、またはその前に unset($a) を実行します。再度使用します。アドレス アプリケーションを処理して解放するには、引き続き上記のコード例を使用します。$arr = ['a', 'b', 'c', 'd', 'e']; foreach ($arr as $i=>&$a) { $a = $a.'_'. $a; echo $a .'<br>'; } echo '<hr>'; echo $a; echo '<hr>'; // 这里 unset 掉 unset($a); echo $a = 'ccc'; echo '<hr>'; print_r($arr); echo '<hr>'; foreach ($arr as $i=>$a) { echo $a .'<br>'; } echo '<hr>'; print_r($arr);
これで、これらの細かい点に注意する必要があります。上記は概要です。編集者が皆さんにお届けする PHP のディスカッション foreach での参照変数の使用の落とし穴に関するすべてのコンテンツはここにあります。皆さんが PHP の中国語 Web サイトをサポートしてくれることを願っています~
PHP の foreach での参照変数の使用の落とし穴に関するその他の記事については、こちらをご覧ください。 、PHP 中国語 Web サイトに注意してください。