0
0

More than 3 years have passed since last update.

foreachで配列を更新する場合の注意(unsetを付ける)

Posted at

foreachで配列を更新する

PHPの配列を更新するのに躓いたので、学習記録の意味でここにメモします。

初歩の初歩のお話。

forで配列を更新し代入し直す方法

まず、forを使って配列に代入し直す方法。

例)$array = [1, 2, 3];の数字の配列の各数字に+1して代入し直す。

$array = [1, 2, 3];
for($i = 0; $i < count($array); $i++){
    $array[$i] = $array[$i] + 1;
}

var_dump($array);

/*実行結果
array(3) {
  [0]=>
  int(2)
  [1]=>
  int(3)
  [2]=>
  int(4)
}
*/

これはかんたん。
他にもっと良い方法がある気もする。

foreachで配列を更新し代入し直す方法

上記をforeachでする方法。

参照代入を使う。

$array = [1, 2, 3];

foreach($array as &$arr){
    $arr = $arr + 1;
}

var_dump($array);

/*実行結果
array(3) {
  [0]=>
  int(2)
  [1]=>
  int(3)
  [2]=>
  &int(4)
}
*/

参照代入で$arrの参照先と$arrayの参照先が同じにして値を更新している。
詳しくは、参照代入で検索。

できたーでーーー・・・・これではダメ。
最終数値がなにか変。&int(4)
foreachで出力するとよくわかります。

$array = [1, 2, 3];

foreach($array as &$arr){
    $arr = $arr + 1;
}


var_dump($array);

foreach($array as $arr){
    echo $arr;
}
/*
array(3) {
  [0]=>
  int(2)
  [1]=>
  int(3)
  [2]=>
  &int(4)
}
233
*/

234となるべきところが233と出力されている・・・
foreach を抜けても最終値($arr)は保持しているので、こうなってしまう・・・
なぜ233と出るのかは詳しい人教えて下さい・・・。

これをなくすためにはunsetを加える。

$array = [1, 2, 3];

foreach($array as &$arr){
    $arr = $arr + 1;
}

var_dump($array);

unset($arr);

foreach($array as $arr){
    echo $arr;
}
/*
array(3) {
  [0]=>
  int(2)
  [1]=>
  int(3)
  [2]=>
  &int(4)
}
234
*/

以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0