forget for get

覚えるために忘れる

foreachで参照渡しで値を変更するとバグる

foreachで参照渡しで値を変更するとバグる

$vals = [1,2,3];
foreach ($vals as &$val) {
  $val *= 2;
}
echo json_encode($vals);
//[2,4,6]

foreach ($vals as $val) {
  echo $val . ',';
}
//2,4,4,

何が起こっているか

$vals = [1,2,3];
foreach ($vals as &$val) {
//$valに$vals[0],$vals[1],$vals[2]への参照が入っていきます
  $val *= 2;
}
echo json_encode($vals);
//[2,4,6]

//$valに$vals[2]への参照が残ったままです

foreach ($vals as $val) {
//$vals[2]へ$vals[0],$vals[1]の値が入っていき、
//$vals[2]には$vals[1]の値が残ります
  echo $val . ',';
}
//2,4,4,

unsetして解決

$vals = [1,2,3];
foreach ($vals as &$val) {
  $val *= 2;
}
echo json_encode($vals);
//[2,4,6]

unset($val); //$vals[2]への参照を解除します

foreach ($vals as $val) {
  echo $val . ',';
}
//2,4,6,