foreachの参照渡しを覚えてから結構頻繁に使っているのですが、思わぬところでバグを産んでしまったので、書いておきます。
広告
まずはサンプルから
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$data1=array("佐藤","田中","加藤"); $data2=array("鈴木","吉田","木村"); foreach($data1 as $k=>&$name){ $name.='さん'; } foreach($data2 as $k=>$name){ echo $name."\n"; } print_r($data1); print_r($data2); |
- $data1に格納された各名前に「さん」を追記
- $data2に格納された各名前を出力
- $data1と$data2の配列の中身を確認
期待した結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
鈴木 吉田 木村 Array ( [0] => 佐藤さん [1] => 田中さん [2] => 加藤さん ) Array ( [0] => 鈴木 [1] => 吉田 [2] => 木村 ) |
実際の結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
鈴木 吉田 木村 Array ( [0] => 佐藤さん [1] => 田中さん [2] => 木村 ) Array ( [0] => 鈴木 [1] => 吉田 [2] => 木村 ) |
参照は続いている
原因は何故かわかっていただけたでしょうか。
$nameの参照は続いたままなので、$data2のforeachで$nameに値が代入される度に$data1で最後に参照渡しされた$data1[2]の値が書き換わってしまっていたのです。
当たり前と言われればそれまでなのですが、1時間以上はまりました。。
foreachで参照渡しを使った後はunsetすることをお忘れなく!
1 2 3 4 5 6 7 8 9 10 11 12 |
$data1=array("佐藤","田中","加藤"); $data2=array("鈴木","吉田","木村"); foreach($data1 as $k=>&$name){ $name.='さん'; } unset($name); foreach($data2 as $k=>$name){ echo $name."\n"; } |
unsetすれば再度$nameを試用しても影響ありません。
foreachの参照をする時は念のためunsetしておきましょう!