ホームページ  >  記事  >  バックエンド開発  >  PHP の foreach で参照変数を使用する場合の落とし穴についての簡単な説明

PHP の foreach で参照変数を使用する場合の落とし穴についての簡単な説明

高洛峰
高洛峰オリジナル
2017-01-03 14:42:101258ブラウズ

私は長年 PHP を書いてきましたが、今でも愚かな間違いを犯しています。PHP のバージョンは 5.6.12 です。

<?php
$arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];
foreach ($arr as $i=>&$a) {
  $a = $a.&#39;_&#39;. $a;
  echo $a .&#39;<br>&#39;;
}
echo &#39;<hr>&#39;;
foreach ($arr as $i=>$a) {
  echo $a .&#39;<br>&#39;;
}
echo &#39;<hr>&#39;;
print_r($arr);

出力結果

PHP の foreach で参照変数を使用する場合の落とし穴についての簡単な説明

冒頭で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 = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];
foreach ($arr as $i=>&$a) {
  $a = $a.&#39;_&#39;. $a;
  echo $a .&#39;<br>&#39;;
}
echo &#39;<hr>&#39;;
echo $a;
echo &#39;<hr>&#39;;
 
// 这里 unset 掉
unset($a);
 
echo $a = &#39;ccc&#39;;
echo &#39;<hr>&#39;;
print_r($arr);
echo &#39;<hr>&#39;;
foreach ($arr as $i=>$a) {
  echo $a .&#39;<br>&#39;;
}
echo &#39;<hr>&#39;;
print_r($arr);

出力結果:

これで、これらの細かい点に注意する必要があります。上記は概要です。編集者が皆さんにお届けする PHP のディスカッション foreach での参照変数の使用の落とし穴に関するすべてのコンテンツはここにあります。皆さんが PHP の中国語 Web サイトをサポートしてくれることを願っています~

PHP の foreach での参照変数の使用の落とし穴に関するその他の記事については、こちらをご覧ください。 、PHP 中国語 Web サイトに注意してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。