【PHP】 forとforeachの書き方と注意点
PHPのfor文は、普通に連番を使ったfor文だけでなく、foreachを利用して値とキーを取り出す方法もあります。foreachで参照を渡す場合の注意のような細かい部分も確認しましょう。
それ以外にも、関数を用いた全件スキャンもあります。非常に重要なので知っておくべきです。
for文
文法自体は他言語のfor文と違いはありません。変数周りの使い方をPHPの仕様に合わせるだけです。
ここで、配列の要素数はcount
関数を用いると取得できます。
$arr = [50, 60, 70]; for ($i = 0; $i < count($arr); $i++) { print("$i: $arr[$i]\n"); }
0: 50 1: 60 2: 70
また、他言語と同様に中身が1行なら波括弧を省略できます。 (要は1つのステートメントならOK)
for ($i = 0; $i < count($arr); $i++) print("$i: $arr[$i]\n");
foreach
配列や連想配列を普通に全件走査する場合、foreach
を用いると便利です。
foreach (配列 as キー変数 => 値変数) {...}
のように書きます。キーを省略してforeach (配列 as 値変数) {...}
のように書くこともできます。
$arr = [50, 60, 70]; // 配列の場合、keyにはインデックスが入る。名前は自由で良い foreach ($arr as $key => $value) { print("$key: $value\n"); } // インデックスの取得は省略可能 foreach ($arr as $value) { print("$value\n"); } $dict = ["foo" => 100, "bar" => 200, "baz" => 300]; // 配列の場合、keyにはインデックスが入る。名前は自由で良い foreach ($dict as $key => $value) { print("$key: $value\n"); } // キーの取得は省略可能 foreach ($dict as $value) { print("$value\n"); }
0: 50 1: 60 2: 70 50 60 70 foo: 100 bar: 200 baz: 300 100 200 300
参照を入れる
ここで、valueの取得では普通の代入と参照の2種類あります。普通の代入の場合、$value
に代入しても元の配列の値は変更されません。変更したい場合は参照にするため、頭に&
を付けます。
$dict = ["foo" => 100, "bar" => 200, "baz" => 300]; foreach ($dict as $value) { $value = "hoge"; } foreach ($dict as $value) { print("$value\n"); }
100 200 300
$dict = ["foo" => 100, "bar" => 200, "baz" => 300]; // &$value のように、頭に&を付ける foreach ($dict as &$value) { $value = "hoge"; } foreach ($dict as $value) { print("$value\n"); }
hoge hoge hoge
参照を使う場合の注意点
参照を入れたときの注意点として、変数はforeachが終わった後も残り続けることです。つまり、foreach後に$value
にすると、値が変わってしまいます。
$dict = ["foo" => 100, "bar" => 200, "baz" => 300]; foreach ($dict as &$value) { // ... } $value = 9999; print($dict["baz"]); // 9999になる
$dict = ["foo" => 100, "bar" => 200, "baz" => 300]; $dict2 = ["hoge" => 3000, "fuga" => 5000, "hige" => 7000]; foreach ($dict as &$value) { // ... } // この時点で&$valueが残っているため、最初のループ時に&$valueの中身が書き換わる foreach ($dict2 as $value) { // ... } print(implode(", ", $dict));
100, 200, 7000
これを防ぐためには、使った後にunset
することです。
$dict = ["foo" => 100, "bar" => 200, "baz" => 300]; $dict2 = ["hoge" => 3000, "fuga" => 5000, "hige" => 7000]; foreach ($dict as &$value) { // ... } // unsetすることで&$valueを削除する ($valueという変数が消えるだけで、中身は消えない) unset($value); // この時点で$valueは未定義のため、問題なし foreach ($dict2 as $value) { // ... } print(implode(", ", $dict));
100, 200, 300
まとめ
PHPのfor文は普通のfor文とforeachがあります。foreachではvalue
に直接代入することで、キーを使用せずに配列の値を書き換えることができますが、foreach後にunset
することを忘れないようにする必要があります。
次の記事でfilterやmapなどを見ていきましょう。
