ホームページ >バックエンド開発 >PHPチュートリアル >PHP foreachを本当に理解していますか?非常にわかりやすい使用例

PHP foreachを本当に理解していますか?非常にわかりやすい使用例

西门大官人
西门大官人オリジナル
2018-07-13 14:48:392060ブラウズ

日常の開発では、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 サイトの他の関連記事を参照してください。

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