PHP foreachで回した配列を更新する
基礎の基礎という感じですが、初投稿も兼ねてforeachで回した配列の要素を更新する方法についてメモします。
例)数値型を持つ配列$arrayの各要素をforeachで取り出し、各要素に+1する
以下はNGケースです。
$array = [1, 2, 3];
foreach($array as $value){
$value += 1;
}
print_r($array);
/* 実行結果 → 各要素に+1されない
Array
(
[0] => 1
[1] => 2
[2] => 3
)
*/
上記のコードでは配列を更新できません。foreachの仕様として、配列要素のコピーがforeach内の変数に格納されるため、更新ができないのです。
foreachの変数を利用して配列要素を更新するためには、参照渡しをする必要があります。
手順は以下2点です。
・更新したいforeach変数の頭に&を付与 (参照渡し)
・更新処理の後にunset(変数名)を記述 (参照渡しの解除)
以下はOKケースです。
$array = [1, 2, 3];
foreach($array as &$value){ //(参照渡し)
$value += 1;
}
unset($value); //(参照渡しの解除)
print_r($array);
/* 実行結果
Array
(
[0] => 2
[1] => 3
[2] => 4
)
*/
まとめ
foreach変数に参照渡しをすることで、配列要素とforeach変数がリンクするので、配列要素の更新が可能になります。
この点は少し注意が必要ですが、foreachを抜けた後も参照渡しをした変数には配列の最後の要素が入ったままなので、unset()で参照渡しの解除をしています。