配列をforeachで回すときに
その配列に値を代入したいときがある。
<?php $array[0] = 0; $array[1] = 0; $array[2] = 0; print_r($array); foreach($array as $value) { print_r("変換前: " . $value . "\n"); $value = 2; print_r("変換後: " . $value . "\n"); } print_r($array); ?>
でも結果はこうなる。
Array ( [0] => 0 [1] => 0 [2] => 0 ) 変換前: 0 変換後: 2 変換前: 0 変換後: 2 変換前: 0 変換後: 2 Array ( [0] => 0 [1] => 0 [2] => 0 )
ループ内では値は変換されているようだけど、
ループ前とループ後では中身が同じになってしまっている。
たぶん
というわけで、参照を利用したforeachにすると
<?php $array[0] = 0; $array[1] = 0; $array[2] = 0; print_r($array); foreach($array as &$value) { print_r("変換前: " . $value . "\n"); $value = 2; print_r("変換後: " . $value . "\n"); } print_r($array); ?>
Array ( [0] => 0 [1] => 0 [2] => 0 ) 変換前: 0 変換後: 2 変換前: 0 変換後: 2 変換前: 0 変換後: 2 Array ( [0] => 2 [1] => 2 [2] => 2 )
値がしっかり変更されております。
foreachの配列を書き変えたいときは
参照を使いましょう。