ホームページ >バックエンド開発 >PHPチュートリアル >PHP: foreach の 2 つの構文拡張の分析例
1 foreach
の構文の紹介 PHP 4 以降のバージョンには、配列を走査するための便利な方法である foreach 構造が含まれています。 foreach は配列でのみ使用でき、他の データ型 または初期化されていない変数で使用しようとするとエラーが発生します。構文は 2 つあり、2 番目の構文は最初の構文を拡張したものです。
foreach(array_expression as $value) statement foreach(array_expression as $key => $value) statement
最初の形式は、指定された array_expression 配列を走査します。ループを通過するたびに、現在のセルの値が $value に割り当てられ、配列内のポインターが 1 ステップ前に移動します (そのため、次のループで次のセルが取得されます)。
2 番目の形式でも同じことを行いますが、現在のセルの値に加えて、キー値も各ループの変数 $key に割り当てられる点が異なります。以下のコードを見てください:
$arr = array("1"=>"111","2"=>"222","3"=>"333"); foreach($arr as $key=>$value) { echo $key."=>".$value."\n"; } 结果如下: 1=>111 2=>222 3=>333
ここでのキー値は、配列要素 a[2] の添字として理解できます。
foreach の実行が開始されると、配列内のポインターが自動的にポイントされます。最初のユニットへ。これは、foreach ループの前にreset()を呼び出す必要がないことを意味します。そして、while ループ をリセットする必要があります。以下の 2 つのコードはまったく同じように機能します。
1. while ループを使用します
$arr = array("one", "two", "three"); reset ($arr); while (list(, $value) = each ($arr)) { echo "Value: $value<br>\n"; }
2. foreach を使用します
foreach ($arr as $value) { echo "Value: $value<br>\n"; }
また、foreach は配列自体ではなく、指定された配列のコピーを操作することに注意してください。したがって、 each() を構築しても、元の配列ポインタは変更されず、配列単位の値は影響を受けません。
foreach は、「@」を使用して エラー メッセージを抑制する機能をサポートしていません。
II PHP foreach の概要
1. foreach での参照の使用。
通常の状況では、foreach($arr as $value) の $arr と $value はコピーであり、外部要因の影響を受けません。つまり、
$arr = array(0,1,2,3,4,5); foreach($arr as $value){ $arr = array(); echo $value; }
結果は次のようになります: 12345
ただし、$arr が参照の場合、状況は異なります。コードを使用して問題を説明します
$arr = array(0,1,2,3,4,5); $arr = &$arr; foreach($arr as $value){ $arr = array(); echo $value; }
結果は: 0
これは、ループで使用される $arr がコピーをコピーするのではなく、元のデータを直接指しているためです。
$value が参照であり、$arr が参照ではない場合、結果は同じです。 同様に、$value はコピーではなく元のデータを指します
$arr = array(0,1,2,3,4,5); foreach($arr as &$value){ $arr = array(); echo $value; }
結果は次のようになります: 0
別の特殊な状況があります。つまり、 $arr がグローバル変数として定義されている場合、$arr も参照になります
global $arr; $arr = array(0,1,2,3,4,5); foreach($arr as $value){ $arr = array(); echo $value; }
結果は: 0
2. 配列を 2 回ループする場合は、このように書いてはいけません
foreach($arr as &$value){} foreach($arr as $value){}
これにより 2 番目のループが発生します。結果は正しくありません (おそらく PHP のバグです)。代わりに以下を使用できます:
//solution 1 foreach($arr as &$value){} unset($value); foreach($arr as $value){} //solution 2 foreach($arr as &$value){} foreach($arr as &$value){} //solution 3 foreach($arr as &$value){} $arr2 = $arr; foreach($arr2 as $value){}
3. foreach が未定義になるのを防ぐために、次のように foreach を書いてみてください
foreach((array)$arr as $value) {}
以上がPHP: foreach の 2 つの構文拡張の分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。