ホームページ >バックエンド開発 >PHPチュートリアル >PHP: foreach の 2 つの構文拡張の分析例

PHP: foreach の 2 つの構文拡張の分析例

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

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 サイトの他の関連記事を参照してください。

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