PHP5のforeach

  • 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
)
  • なんだか、おまじないみたいなコードが必要になってしまいましたが…

facebook slideshare rubygems github qiita