PHPのforeachを徹底解説【サンプルコード有】

2020年2月12日

今回はPHPの記法「foreach(フォーイーチ)」について解説します。

PHPでWEBサービスを作る上では必須レベルで使用することもありますので、しっかり仕様を理解した上で活用していきましょう。

foreachは、配列の件数分繰り返す処理を行える便利な記法

foreachは、配列の中身の数だけ繰り返し処理を行う便利な記述です。

文法は以下のように書きます。

foreach(配列 as 値が入る変数){
    //繰り返し処理
}

foreachで囲われた{}で、配列の中身を繰り返し取得できます。

サンプルコード
$aryHoge = ['Apple', 'Banana', 'Grape', 'Cherry', 'Orange'];

foreach($aryHoge as $value){
    echo $value."<br>";
}
Apple
Banana
Grape
Cherry
Orange

配列のキー(添え字)も取得したい場合は$key=>$valueと書く

foreachは、繰り返し処理の中で配列のキー(添え字)も書き方を変えるだけで取得できます。

foreach(配列 as キーが入る変数 => 値が入る変数){
    //繰り返し処理
}

キーに入る変数と値に入る変数をそれぞれ設定しましょう。

多くの場合はキーは$key、値は$valueと書くことが多いです。
よく誤解されがちですが、変数は$key、$value以外にも自由に付けられます。

サンプルコード
$aryHoge = ['Apple', 'Banana', 'Grape', 'Cherry', 'Orange'];

foreach($aryHoge as $key => $value){
    echo $key.':'.$value."<br>";
}
0:Apple
1:Banana
2:Grape
3:Cherry
4:Orange

foreachは連想配列にも対応できる

foreachの便利な点として、キー(添え字)が文字列である連想配列にも対応できる点です。

キーが連番であればfor文でも繰り返し処理が行えるのですが、連想配列には対応できませんでした。

その点foreachはキーの書式に関わらず、自動的に配列を展開してくれます。

サンプルコード
$aryHoge = [
    'Apple' => 'りんご',
    'Banana' => 'バナナ',
    'Grape' => 'ぶどう',
    'Cherry' => 'さくらんぼ',
    'Orange' => 'オレンジ'
];

foreach($aryHoge as $key => $value){
    echo $key.':'.$value."<br>";
}
Apple:りんご
Banana:バナナ
Grape:ぶどう
Cherry:さくらんぼ
Orange:オレンジ

foreachのループ内で使用できる記述

foreachのループ内で使用できる命令文も確認しておきましょう。

continue – ループ内の以降の処理をスキップする

continue(コンティニュー)文は、記述した以降の処理をスキップして、次のループを行う処理です。

サンプルコード
$aryHoge = [
    'Apple' => 'りんご',
    'Banana' => 'バナナ',
    'Grape' => 'ぶどう',
    'Cherry' => 'さくらんぼ',
    'Orange' => 'オレンジ'
];

foreach($aryHoge as $key => $value){
    if($key === 'Grape'){
        continue;
    }
    echo $key.':'.$value."<br>";
}
Apple:りんご
Banana:バナナ
Cherry:さくらんぼ
Orange:オレンジ

キーが「Grape」の場合のみ「continue」に分岐する処理を追加し、処理をスキップしました。

「Grape:ぶどう」がechoされていないことが分かりますね。

break – ループを脱出する

break文は、ループ処理を脱出し繰り返しを終了させる命令です。

サンプルコード
$aryHoge = [
    'Apple' => 'りんご',
    'Banana' => 'バナナ',
    'Grape' => 'ぶどう',
    'Cherry' => 'さくらんぼ',
    'Orange' => 'オレンジ'
];

foreach($aryHoge as $key => $value){
    if($key === 'Grape'){
        break;
    }
    echo $key.':'.$value."<br>";
}
Apple:りんご
Banana:バナナ

3回目に通る「Grape」の時にbreak処理が読み込まれたので、ループを脱出しました。

続く「Cherry」「Orange」もechoされていないことが分かります。

foreach応用編

最後に、foreach処理で覚えておくとちょっと便利な記述についてまとめておきます。

ループ内で配列の値を直接変更する(参照渡し)

通常はループ内で配列の値、例えば$valueに代入をしても、配列の値が書き換わるわけではありません。

サンプルコード
$aryHoge = [1, 2, 3, 4];
foreach($aryHoge as $value){
    $value *= 5; //値を5倍にして代入
}

print_r($aryHoge); //5倍になっていない
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)

これを、$valueの前にアンド(&)を付けることで、元の配列の値を参照し、値を書き換えることが出来ます。

サンプルコード
$aryHoge = [1, 2, 3, 4];
foreach($aryHoge as &$value){
    $value *= 5; //値を5倍にして代入
}

unset($value); //バグ回避のため参照渡しを解除しておく

print_r($aryHoge); //5倍になっている
Array
(
    [0] => 5
    [1] => 10
    [2] => 15
    [3] => 20
)

foreachの参照渡しの仕様についてまとめた記事もご確認ください。

【PHP】foreachの参照渡しで起こり得るバグの対策方法

ループの最初または最後に判定を行う

ループ内で、最初のループ、または最後のループで特定の処理を行いたい時の記述です。

事前に配列の最初のキー、最後のキーを変数として取得し、ループ内で判定を行います。

キーの取得は、key()関数と配列を最初・最後を切り取れるarray_slice()関数を使用します。

参考 【PHP】array_sliceの使い方。配列を範囲指定して切り取る関数

サンプルコード
$aryHoge = [
    'Apple' => 'りんご',
    'Banana' => 'バナナ',
    'Grape' => 'ぶどう',
    'Cherry' => 'さくらんぼ',
    'Orange' => 'オレンジ'
];

$first_key = key(array_slice($aryHoge, 0, 1, true));  //最初のキーを取得
$last_key = key(array_slice($aryHoge, -1, 1, true));  //最後のキーを取得

foreach($aryHoge as $key => $value){
    if ($key === $first_key){
        //最初の処理
        echo '最初→';
    }
    if ($key === $last_key){
        //最後の処理
        echo '最後→';
    }
    echo $key.':'.$value."<br>";
}
最初→Apple:りんご
Banana:バナナ
Grape:ぶどう
Cherry:さくらんぼ
最後→Orange:オレンジ

多次元配列でforeachを入れ子にして記述する

foreachのループ内でforeachを使用することも可能です。

配列の値に配列が入る多次元配列では使うこともあるので覚えておきましょう。

サンプルコード
$aryHoge = [
    'セリーグ' => ['巨人', 'DeNA', '阪神', '広島', '中日', 'ヤクルト'],
    'パリーグ' => ['西武', 'ソフトバンク', '楽天', 'ロッテ', '日本ハム', 'オリックス']
];

foreach($aryHoge as $key1 => $val1){
    echo '【'.$key1.'】'."<br>";
    foreach($val1 as $key2 => $val2){
        echo $val2."<br>";
    }
}
【セリーグ】
巨人
DeNA
阪神
広島
中日
ヤクルト
【パリーグ】
西武
ソフトバンク
楽天
ロッテ
日本ハム
オリックス

foreachの入れ子の中でうっかり$keyと$valueを上書きしないように、変数はそれぞれのforeachで分けて設定してください。


foreachは配列を扱う上で切っても切り離せないくらい使う記述です。

使いこなすとデータ処理が大きく楽になるので、仕様を把握して使いこなしていきましょう。

以上、PHPのforeachを徹底解説、でした。

PHP