LoginSignup
0
1

More than 5 years have passed since last update.

foreachの参照渡しでハマった^^;

Posted at

PHPのforeachループつかって配列の中身をいじりたいときに、参照渡しでこんなコード書いてハマりました

foreach($list as &$row){
    if (!file_exist(FILEPATH . $row['filename'])){
        $row['filename'] = newfile();
    }   
}

参照渡しつかうことで $row を書き換えるだけで $list を更新できて便利だと思って使ってたんですが…

このサンプルコードだと、このあとで$rowを変更するとハマります。

foreach($list as &$row){
    if (!file_exist(FILEPATH . $row['filename'])){
        $row['filename'] = newfile();
    }   
}
// あれこれいろんな処理
$row = [];

こんな風になってると $row = []した瞬間に $listの最後の要素まで書き換わります。

なんとなく、このサンプルでは $row がforeachブロック内だけで有効なローカル変数のように感じるんですが、実際にはforeachブロックから外れても有効な変数なので、こういうことが発生するんですね。

やっぱり参照渡しって気づかぬうちに意図せず書き換えるコードを作り込んでしまう要因になりやすい気がします。

ってことで、ちょっと不格好な気もするけど↓の方がいいかなって思いました。

foreach($list as $key => $row){
    if (!file_exist(FILEPATH . $row['filename'])){
        $list[$key]['filename'] = newfile();
    }   
}

0
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1