foreachの参照変数ループではまったのでメモ
以下抜粋
Reproduce code:
1 2 3 4 5 6 7 8 |
<?php $array = array(1,2,3); foreach( $array as &$item ) { } print_r( $array ); foreach( $array as $item ) { } print_r( $array ); ?> |
Expected result:
Array
(
[0] => 1
[1] => 2
[2] => 3
)
Array
(
[0] => 1
[1] => 2
[2] => 3
)
Actual result:
Array
(
[0] => 1
[1] => 2
[2] => 3
)
Array
(
[0] => 1
[1] => 2
[2] => 2
)
対処はPHPマニュアルに書いてありました。
foreachループ抜けたら変数unset()しろとのこと。
foreachブロック抜けてもas変数がブロックスコープ外扱いなのか、、、気持ち悪いけどそういうものだと理解。
PHP マニュアル 言語リファレンス 制御構造 > foreach
抜粋
1 2 3 4 5 6 7 8 9 |
<?php $arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } // $arr は array(2, 4, 6, 8) となります unset($value); // 最後の要素への参照を解除します ?> |
警告
foreach ループを終えた後でも、 $value は配列の最後の要素を参照したままとなります。 unset() でその参照を解除しておくようにしましょう。