by shigemk2

当面は技術的なことしか書かない

foeachの配列の中身を書き変える

PHP: foreach - Manual

配列をforeachで回すときに
その配列に値を代入したいときがある。

<?php
$array[0] = 0;
$array[1] = 0;
$array[2] = 0;
print_r($array);
foreach($array as $value) {
  print_r("変換前: " . $value . "\n");
  $value = 2;
  print_r("変換後: " . $value . "\n");
 }
print_r($array);

?>

でも結果はこうなる。

Array
(
    [0] => 0
    [1] => 0
    [2] => 0
)
変換前: 0
変換後: 2
変換前: 0
変換後: 2
変換前: 0
変換後: 2
Array
(
    [0] => 0
    [1] => 0
    [2] => 0
)

ループ内では値は変換されているようだけど、
ループ前とループ後では中身が同じになってしまっている。
たぶん

というわけで、参照を利用したforeachにすると

<?php
$array[0] = 0;
$array[1] = 0;
$array[2] = 0;
print_r($array);
foreach($array as &$value) {
  print_r("変換前: " . $value . "\n");
  $value = 2;
  print_r("変換後: " . $value . "\n");
 }
print_r($array);

?>
Array
(
    [0] => 0
    [1] => 0
    [2] => 0
)
変換前: 0
変換後: 2
変換前: 0
変換後: 2
変換前: 0
変換後: 2
Array
(
    [0] => 2
    [1] => 2
    [2] => 2
)

値がしっかり変更されております。

foreachの配列を書き変えたいときは
参照を使いましょう。