日常の開発では、PHP の foreach を使用して配列を走査することがほぼ標準となっています。配列のキーと値を非常に便利に走査できます。 しかし、その性格を本当に理解していますか?
PHP foreach の使い方
次の PHP 中国語 Web サイトでは、PHP foreach の使い方と注意事項を例を使って説明しています。
例: 次の配列があります:
$array = array(1,2,3,4,5);
$array 配列の各要素の値を 1 ずつ増やす必要があります
通常、次の処理方法、方法 1:
foreach($array as $key => $value){ $array[$key] = $value+1; }
を使用することもできます。また、次の方法、方法 2:
foreach($array as &$value){ $value = $value+1; }
通常の状況では、これら 2 つの記述方法は問題を引き起こしません。結果は同じになります。しかし、$value に新しい値 8 を代入するなど、次のプログラムで $value を使用する必要がある場合、方法 2 の結果は奇妙に変化します。
foreach($array as &$value){ $value = $value+1; } $value = 8;
print_r($array) が出力されるとき、
Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 5 [4] => 6 );
が出力されることを期待しますが、実際には次のように出力されます:
Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 5 [4] => 8 ),
つまり、最後の要素は 8 になります。
なぜそのような状況が発生するのでしょうか?
実際、メソッド 2 の $value は参照であり、グローバルです。foreach が実行されるとき、$value への参照はまだ有効であり、その結果、外部の $value への参照が発生します。変更は $array の最後の要素に影響します。
それでは、この問題をどうやって解決すればいいのでしょうか?
方法は非常に簡単で、$value は foreach の外ではまだ有効なので、foreach の実行が完了した後で $value の設定を解除できます。改善されたコードは次のとおりです。
foreach($array as &$value){ $value = $value+1; } Unset($value); $value = 8;
プログラムは $array の最後の要素を 6 として出力するようになり、$value の変更の影響を受けなくなりました。
以上がPHP foreachを本当に理解していますか?非常にわかりやすい使用例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。