リスティング広告 運用代行サービス|株式会社カルテットコミュニケーションズ|Yahoo広告/Google広告正規代理店

PHPのforeachで参照渡しを使ったときの落とし穴

公開日:
更新日:

まず前提ですが、PHP の foreach では、以下のように $value に & を付けることで参照渡しが使えます。

[php]
foreach ($array as &$value) {
// do something.
}
foreach ($array as $key => &$value) {
// do something.
}
[/php]

ループ内で配列の中身を上書きしたいときにコードがスッキリして便利なんですが、むやみに使っていると思わぬバグを引き起こすことがあるので注意が必要です。

悪い例

[php]
$array = array(1, 2, 3);
foreach ($array as &$value) {
// do nothing.
}
$value = 10;
var_dump($array);
[/php]

出力結果

array(3) {
 [0]=>
 int(1)
 [1]=>
 int(2)
 [2]=>
 &int(10) ← これがおかしい
}

良い例

[php]
$array = array(1, 2, 3);
foreach ($array as &$value) {
// do nothing.
}
unset($value); // これが重要.
$value = 10;
var_dump($array);
[/php]

出力結果

array(3) {
 [0]=>
 int(1)
 [1]=>
 int(2)
 [2]=>
 int(3)
}

解説

お察しのとおり、foreach を抜けた時点で $value は $array の最終要素のポインタを保持しているので(PHPにはブロックスコープがないので)、別の用途に $value を使おうとして、何も考えずに何かを代入すると $array の最終要素が上書きされてしまうわけですね。

良い例で示したように、$value を unset しておけば参照は解除されるので問題は起こりません。foreach で参照渡しを使う際は覚えておきましょう。

1営業日以内に返信いたします 広告の運用代行についてのお問い合わせはこちら
シェアする

ブログ記事の中で広告運用の事例をご紹介することがありますが、実際の事例を一部加工した内容となっておりますのでご留意ください。

また、2018年7月24日よりGoogle AdWordsはGoogle広告に名称変更されました。それ以前の記事に関してはGoogle AdWordsと表記されておりますのでご了承ください。


リスティング広告の
情報をお届け

メルマガではリスティング広告に詳しくなれる記事を毎週一週間分まとめてお届けします。不定期にはなりますがリスティング広告に限らず、Web集客改善に繋がる資料もお送りしていきますので、興味のある方はぜひご登録ください。

同じカテゴリの最近の記事