Posted at

【備忘録】PHPのforeachについて考えてみる


目的

・foreachについて理解を深める

・foreachについての間違った知識をただす


foreachを使用したコードの比較


例1

<?php

$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
var_dump($arr);
?>


例1の出力

array(4) { [0]=> int(2) [1]=> int(4) [2]=> int(6) [3]=> &int(8) }


foreachしたら、配列の要素を1個ずつ取り出すことができるっていうイメージしかなかったから、$arrの値が更新される概念が全然なかった。なんなら$arrは空と思ってた


例2

<?php

$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}

var_dump($arr);
var_dump($value);
?>



例2の出力

array(4) { [0]=> int(2) [1]=> int(4) [2]=> int(6) [3]=> &int(8) } int(8)


foreachのループ処理で使用した$valueを出力すると、$arr[3]を出力している。ループ終了後は、最後の要素を参照している見たい


例3

<?php

$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}

unset($value);
var_dump($arr);
var_dump($value);
?>



例3の出力

array(4) { [0]=> int(2) [1]=> int(4) [2]=> int(6) [3]=> int(8) } NULL


foreachループ終了後に、最後の要素を参照していた$valueをunset関数で囲むと、NULLになる


まとめ

・foreachは、要素の数の分だけループ処理する

・foreachは、要素を1個ずつ取り出すイメージではなく、要素を1個ずつ参照しているイメージ

・foreach内でループ処理の受け皿になっていた変数は、最後の要素を参照する