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,