【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");
}
result
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");
}
result
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");
}
result
100
200
300
参照の場合
$dict = ["foo" => 100, "bar" => 200, "baz" => 300];

// &$value のように、頭に&を付ける
foreach ($dict as &$value) {
    $value = "hoge";
}

foreach ($dict as $value) {
    print("$value\n");
}
result
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));
result
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));
result
100, 200, 300

まとめ

PHPのfor文は普通のfor文とforeachがあります。foreachではvalueに直接代入することで、キーを使用せずに配列の値を書き換えることができますが、foreach後にunsetすることを忘れないようにする必要があります。

次の記事でfilterやmapなどを見ていきましょう。

php for thumb

役に立ったらシェアしよう!