46
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPのforeachで参照渡しをしたいときに気をつけること

Posted at

#foreachで参照渡し
ループを回して、その中で値を上書きする時は参照渡しをして上書きしたいってことがあると思います。
foreachの参照渡しをよく理解していなかったので、PHPマニュアルを参考に調べました。

$array = ['key1' => 'val1' , 'key2' => 'val2'];
foreach ($array as &$value) {
    $value = $value . '書き換えた';
}
var_dump($array); 
// ["key1"] =>  string(19) "val1書き換えた" ["key2"] =>  &string(19) "val2書き換えた"

出力結果のkey2のvalueが「&string」となっています。
ループを終えた場合にも、valueが最後の値を参照したままになっているため、次にarrayを使用する際に不具合が生じる可能性が高いです。

#参照渡しをしたい場合にはどうするか
###unsetを使用する
unsetは指定した変数の割り当てを解除します。
これをforeachの後に使用することで、valueが最後の値を参照しているのを解除できます。

$array = ['key1' => 'val1' , 'key2' => 'val2'];
foreach ($array as &$value) {
    $value = $value . '書き換えた';
}

unset($value);
var_dump($array); 
// ["key1"] =>  string(19) "val1書き換えた" ["key2"] =>  string(19) "val2書き換えた"

###keyとvalueを使用する
こんな感じでkeyとvalueを使用すれば同じことができます。
なので参照渡しはどうしても必要じゃないとき以外は使用しない方が良さそうです。

$array = ['key1' => 'val1' , 'key2' => 'val2'];
foreach ($array as $key => $value) {
    $array[$key] = $value . '書き換えた';
}
var_dump($array); 
// ["key1"] =>  string(19) "val1書き換えた" ["key2"] =>  string(19) "val2書き換えた"
46
33
0

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
46
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?