1

いくつかのコードを書いたとき、次のコードの結果を期待していなかったので、PHP は私を少し混乱させました。

$data = array(array('test' => 'one'), array('test' => 'two'));

foreach($data as &$entry) {
    $entry['test'] .= '+';
}

foreach($data as $entry) {
    echo $entry['test']."\n";
}

出力すればいいと思います

one+
two+

ただし、結果は次のとおりです。http://ideone.com/e5tCsi

one+
one+

誰かが私に理由を説明できますか?

4

2 に答える 2

3

これは予想される動作です。https://bugs.php.net/bug.php?id=29992も参照してください。

参照は 2 番目の foreach を使用するときに維持されるため、2 番目の foreach を使用すると、$entryまだ を指している$data[1]の値が最初の値で上書きされます。

Ps(@billyonecanに感謝します):unset($entry)参照が破棄されるように、最初に行う必要があります。

于 2013-05-02T16:35:29.080 に答える
0

これは、 foreach のドキュメントで特に言及されています。unset参照によって配列の要素を取得するときは、ループ変数を使用する必要があります。

警告

$value と最後の配列要素の参照は、foreach ループの後でも残ります。unset() で破棄することをお勧めします。

于 2013-05-03T06:57:04.020 に答える