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
*/
以上。