Posted at

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

More than 1 year has passed since last update.


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