ホームページ  >  記事  >  バックエンド開発  >  PHP: foreach と in_array の使用例の詳細な説明

PHP: foreach と in_array の使用例の詳細な説明

伊谢尔伦
伊谢尔伦オリジナル
2017-06-23 14:42:282095ブラウズ

php は開発において非常に効率的であり、これは理解できますが、実行効率が犠牲になります。 php 配列 は非常に強力ですが、念のため、さらに検討していくつかの状況を試してみる必要があります。今後さらに発見した場合は、補足してください。

1. foreach は、データやオブジェクトの内容を簡単に読み取ることができる配列を走査する簡単な方法を提供します。ただし、公式ドキュメントには、foreach は内部配列ポインターに依存しているため、その値が変更されると記載されています。ループ内で予期しない動作が発生する可能性があります。したがって、基本的には、 1. ループ内で値を変更しないでください。そうしないと、意図した結果が得られません。 2. '&' を使用するのは安全な方法ですが、使用されることはほとんどありません。 used 参照が終了したら、すぐに unset 関数を呼び出して変数を破棄する必要があります。そうしないと、次のコードでこの変数が再度使用されると、ループの最後の値が変更され、次のような予期しない値が発生します。リストがループで出力されると、出力の最後の行に多くの乱雑な値または null 値が表示されます。 unset を使用すると、この問題が解決されます。

例を見てみましょう

<?php 
/*-------------------------------------------------------------------------*/ 
/* foreach example 1: value only */ 
echo "foreach example 1: value only ".&#39;<br />&#39;; 
$a = array(1, 2, 3, 17); 
foreach ($a as $v) { 
echo "Current value of ".$a.":". $v."<br />"; 
} 
?> 
// 运行结果 
foreach example 1: value only 
Current value of $a: 1 
Current value of $a: 2 
Current value of $a: 3 
Current value of $a: 17

2.

in_array, 意味は、前の string が後者の配列に存在するかどうかを確認することであり、ほとんどの場合、次のように機能します。ただし、次の配列が array(0,1,2,3) などの整数の場合、PHP は前の文字列を intval するため、値 0 が取得されます。配列にこの値があれば、方程式が成立しますね。
したがって、次のデータが整数であると判断された場合、特にそれが 0 である可能性がある場合 (これによりすべての文字列が置き換えられる可能性があります)、この関数を使用してはなりません。ただし、後続のデータは代わりに key_exists を使用できます。

array_flip

を使用して反転する必要があります。 もう一度例を見てみましょう

function search($keyWord, $stack) {//此处判断是应该更新还是插入

      foreach ($stack as $key => $val) {

        if (in_array($keyWord, $val)) {

          return TRUE;

        }

      }

      return FALSE;

    }

値を取得するために文字列を配列として使用するとどうなるでしょうか? PHP は非常にフォールト トレラントな言語であるため、間違いを修正するために最善を尽くします。そのため、参照添字は 0 に変換されます。その場合、文字列添字は 0 になり、値は You になります。最初の文字列の値を取得します。これは予想を超えていますか?解決策は、添え字 is_array を参照する前に、変数が配列であるかどうかを確認することです。

3. foreach で変数を引用するときに発生する問題

私は長年 PHP を書いてきましたが、今日も

foreach変数 を引用するときに問題が発生しました。 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);
出力結果

2 番目の foreach の出力結果を初めて見たとき、どうやって d_d が 2 つ出力されるのか非常に混乱しました。


よく考えてみると、PHP foreach の $a のスコープは

関数

全体のローカル変数であるため、ループ内に囲まれるのではなく、ループの外側でも有効であることがわかりました。ループ、

そのため、2 番目の foreach を実行するときの $a が新しい変数ではなく、それでも $arr の 5 番目の要素のアドレス参照を指している場合、array

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回目: 5番目の要素にd_dが代入され、結果は: [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 と in_array の使用例の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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