LoginSignup
44
32

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書き換えた"
44
32
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
44
32