PHP5からforeach($arr as &$value) と記述すると、配列要素の値を変更可能になっていますね。各要素に値を追加する場面で使用してみたのですが、なんかおかしい。最後の要素が書き換わるようです。 実験してみました。
テストソース1:
$test = array( 1, 2, 3, 4, 5);
foreach ($test as &$value) {}
foreach ($test as $value) {}
print_r($test);
結果1:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 4
)
最初のforeachの$valueの参照ポインタが残ってるみたいです。つまり最初のforeachを抜けた時点で、$test[4]のポインタを指している。($value = &test[4])
テストソース2:
$test = array( 1, 2, 3, 4, 5);
foreach ($test as &$value) {}
$value=99999;
print_r($test);
結果2:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 99999
)
うーん。理屈はなんとなく分かったけれど、意図しない結果を招きそうです。回避策を考えてみます。ポインタが残ってるようなので、クリアすればいいだろうということで。
テストソース3:
$test = array( 1, 2, 3, 4, 5);
foreach ($test as &$value) {}
unset($value);
$value=99999;
print_r($test);
結果3:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
まあ、こんなところもPHPか。