どうもこんにちは。
PHPをいじっていて少し引っかかったことがあったのでメモメモ……
foreach文の中で、 引数として渡している配列の中身を変更するために、参照渡し(&$hogeみたいな感じで書く)を利用してみました。
↓例えばこんな感じで
1 2 3 4 5 |
$aryHoge = array('hoge', 'huga', 'nyaa'); foreach ($aryHoge as &$item) { $item .= 'hoge'; } |
こうすると、配列$aryHogeの中身がちゃんと変更されます。
でも、下記のように書くと、なんだかおかしなことになります。
1 2 3 4 5 6 7 8 9 10 11 12 |
$aryHoge = array('hoge', 'huga', 'nyaa'); foreach ($aryHoge as &$item) { $item .= 'hoge'; } //上のforeachで作成した$itemをそのまま使って別のforeach文を書くとおかしなことに $aryFuga = array('fuga', 'foge', 'waaa'); foreach ($aryFuga as $item) { //ここは本題ではないので、何かてきとな処理 } |
上記のように書くと、最初の配列$aryHogeの値が書き変わってしまいます。
どうやら、 foreachで作成した変数$itemに、$aryHogeの参照が残ったままになっているみたいです。
仕方ないので、とりあえず場当たり的に、2つ目のforeachの変数を$valのような別の名前に変えて対処しましたが、何でこうなるのか気になったので調べてみたら、すぐに引っかかりました。
foreachの参照 – CROOZ Tech Blog http://techblog.crooz.jp/?p=4738
最後に注意点として、PHPにはブロックスコープがないので
foreachで作成した$keyや$valueは、foreachを抜けても値が入ったままです。なので参照渡しでつかった$valueにうっかり値をいれてしまうと…
参照先の値が書き換わってしまいます。
なので忘れずにunsetしましょう。
「ブロックスコープがない」。if文やらfor文やらの内部で宣言した変数が外でもそのまま使えるってことですわね。
これって、宣言も代入も同じ構文のPHPなんかじゃ、ミスの温床になるんじゃないかしら??
ここまで書いていて気がついたのですが、自分もよくif文の中で初めて宣言した変数なんかに平気でアクセスしてました。今になって考えると無意識にそんなことをしてたんですな……なんだか恐ろしい(;ω;`)