foreach文とは?
foreach文を用いることで配列の各要素に対して繰り返し処理を設定できます。
通常のfor文で、配列の各要素に対して処理を設定することもできますが、その場合には繰り返し回数の設定や、表示させる配列の配列番号を指定する必要があり、手間が掛かかります。
foreach文は、PHPで配列や連想配列の要素を順番に処理する際に最もよく使われる繰り返し構文で、インデックス管理を行わずにシンプルに記述できる点が特徴です。
それでは基本構文や実用例について見ていきましょう。
foreach文の基本構文と実用例
まずは基本構文から確認していきます。
foreach (配列名 as 変数名) {
繰り返したい処理
}配列の各要素を変数に代入してから、繰り返したい処理を行うようなイメージです。
代入した変数を繰り返し処理の中で使用することができます。
それでは実用例を見ていきましょう。
<?php
$areas = [
"東京都",
"大阪府",
"福岡県",
"宮城県"
];
foreach ($areas as $area) {
echo $area . "\n";
}
?>実行結果は下記の通りです。
東京都
大阪府
福岡県
宮城県配列の各要素について、繰り返し処理が適用されています。
foreach文は基本的な配列処理だけでなく、indexの取得や連想配列、多次元配列の操作など、さまざまな場面で使用されます。ここからは実際の使用パターンごとに詳しく見ていきましょう。
index を取得したい場合
次に index を取得してみましょう。index とは配列の各要素に自動で割り振られている配列番号のことです。
index 取得の構文は下記の通りです。
foreach (配列名 as $index => 変数名) {
繰り返したい処理
}「as」の後ろに「$index =>」 を追加するだけです。
それでは実用例を見ていきましょう。
<?php
$areas = [
"東京都",
"大阪府",
"福岡県",
"宮城県"
];
foreach ($areas as $index => $area) {
echo "index:" . $index . ", area:" . $area . "\n";
}
?>実行結果は下記の通りです。
index:0, area:東京都
index:1, area:大阪府
index:2, area:福岡県
index:3, area:宮城県通常、配列の要素を取得する際には $areas[0] といった形で配列番号を指定しますが、その配列番号をこのように取得できます。
連想配列での使用
続いて連想配列に foreach 文を適用する方法を見ていきましょう。
連想配列に対して foreach 文を使う場合の構文は下記の通りです。
foreach (連想配列名 as $key => 変数名) {
繰り返したい処理
}index の取得方法と似ていますね。
普通の配列の場合とは違い、キー名を指定できるようになっています。
それでは連想配列の場合の foreach 文の実用例を見てみましょう。
<?php
$areas = [
"関東" => "東京都",
"関西" => "大阪府",
"九州" => "福岡県",
"東北" => "宮城県"
];
foreach ($areas as $key => $area) {
echo $area . "は" . $key . "地方です。\n";
}
?>実行結果は下記の通りです。
東京都は関東地方です。
大阪府は関西地方です。
福岡県は九州地方です。
宮城県は東北地方です。このようにキー名と配列要素をセットで繰り返し処理に使用することができます。
【練習】
下の枠で実際に、連想配列にforeach文を適用してみましょう。
Aさんは90点、Bさんは70点、Cさんは100点です。
3人の合計点数を出力してみましょう。
続けてサンプルコードがあります。
【サンプルコード】
<?php
$scores = array(90, 70, 100);
$total = 0;
foreach ($scores as $score) {
$total += $score;
}
echo '合計点数は'.$total.'点です。';
?>【実行結果】
合計点数は260点です。
応用:多次元配列での使用
更に応用として、多次元配列に foreach 文を適用する方法を見ていきましょう。
多次元配列では、1つひとつの要素の中にさらに配列が入っています。そのため、外側のforeachで大分類を取り出し、内側のforeachで中身を順番に処理する形にすると分かりやすくなります。
添字を固定して $area[0], $area[1], $area[2] のように書くこともできますが、要素数が変わったときに対応しにくいため、基本的には二重のforeachを使う方法がおすすめです。
【サンプルコード】
<?php
$areas = [
"関東" => ["東京都", "神奈川県", "埼玉県"],
"関西" => ["大阪府", "京都府", "奈良県"],
"九州" => ["福岡県", "鹿児島県", "長崎県"],
"東北" => ["宮城県", "青森県", "秋田県"]
];
foreach ($areas as $region => $prefectures) {
echo $region . "地方:" . "\n";
foreach ($prefectures as $prefecture) {
echo "・" . $prefecture . "\n";
}
}
?>実行結果は下記の通りです。
関東地方:
・東京都
・神奈川県
・埼玉県
関西地方:
・大阪府
・京都府
・奈良県
九州地方:
・福岡県
・鹿児島県
・長崎県
東北地方:
・宮城県
・青森県
・秋田県多次元配列では、外側のforeachで「地方ごとの配列」を取り出し、内側のforeachでその中の都道府県を1つずつ取り出しています。
このように二重のforeachを使えば、要素数が増減しても柔軟に対応できます。
実務でも、多次元配列を処理するときは添字を固定するより、この形で書く方が扱いやすいです。
foreach文で配列の値を変更する方法
foreach文では、配列の値を取り出して表示するだけでなく、配列の各要素そのものを書き換えることもできます。
その場合は、変数の前に「&」を付けて、参照渡しで受け取ります。
基本構文は下記の通りです。
foreach(配列名 as &$変数名){
繰り返したい処理
}
unset($変数名);
「&」を付けることで、配列の値をコピーして受け取るのではなく、元の配列要素を直接変更できるようになります。
それでは実用例を見てみましょう。
【サンプルコード】
<?php
$prices = [100, 200, 300];
foreach ($prices as &$price) {
$price = (int)($price * 1.1);
}
unset($price);
foreach ($prices as $price) {
echo $price . "\n";
}
?>【実行結果】
110
220
330このように、foreach文で各要素を直接書き換えることができます。
ただし、参照渡しを使った場合は、foreach文のあとにunset($price); を書いて参照を解除しておく必要があります。
unset を書かないまま同じ変数名を後続の処理で使うと、最後の要素への参照が残り、意図しない値の上書きが起こることがあります。
配列の中身を更新したいときは便利ですが、通常は値を取り出すだけの書き方を使い、要素を変更したい場合だけ参照渡しを使うのがおすすめです。
foreach文が使えない場合
ここまで配列専用の for 文として foreach 文の使い方を紹介してきました。
しかし foreach 文を使用すると逆に手間が掛かってしまうパターンも存在します。
そういった場合は通常の for 文を使用した方が良いです。
実際に例を見た方が理解が早いかと思いますので、コードを確認してみましょう。
<?php
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
for ($i = 0; $i < count($numbers) - 1; $i++) {
echo $numbers[$i] . " の次の要素は " . $numbers[$i + 1] . " です。\n";
}
?>実行結果は下記の通りです。
1 の次の要素は 2 です。
2 の次の要素は 3 です。
3 の次の要素は 4 です。
4 の次の要素は 5 です。
5 の次の要素は 6 です。
6 の次の要素は 7 です。
7 の次の要素は 8 です。
8 の次の要素は 9 です。
9 の次の要素は 10 です。こういった「次の要素を参照する」ような処理では通常の for 文を使用した方が良いです。foreach 文は index や key と各要素を結び付けて繰り返し処理を設定しているため、こういったパターンは向いていません。(できないことはありませんが…)
「次の要素を参照する」ような処理も使用することはありますので、foreach 文が使えないパターンも知っておくことが大切です。
おまけ:continueとbreak
ここからは余力があれば覚えておきたい使い方になります。
continue と break についてです。
簡単なアプリケーションを作る上ではあまり使用機会がないかもしれませんが、チームとして開発に携わる場合には使用頻度は高いです。まだ余裕がある人は頑張って覚えていきましょう。
簡単に説明すると continue は処理をスキップする役割を持ち、break は処理を中断させる役割を持ちます。
どちらも同じく繰り返し処理の中で使用することが多く、「条件に一致したら continue(break) させる」といった使い方をします。
実際に例を見た方が理解が早いかと思いますので、コードを確認してみましょう。
<?php
$areas = [
"東京都",
"大阪府",
"福岡県",
"宮城県"
];
echo "continue を追加した場合\n";
foreach ($areas as $area) {
if ($area === "大阪府") {
continue;
}
echo $area . "\n";
}
echo "\nbreak を追加した場合\n";
foreach ($areas as $area) {
if ($area === "大阪府") {
break;
}
echo $area . "\n";
}
?>実行結果は下記の通りです。
continue を追加した場合
東京都
福岡県
宮城県
break を追加した場合
東京都本来であれば繰り返し処理で「東京都」「大阪府」「福岡県」「宮城県」が表示されるはずです。
しかし continue を追加した場合では「大阪府」のみ飛ばされており、「東京都」「福岡県」「宮城県」しか表示されていないことが分かると思います。
break を追加した場合では「大阪府」の表示処理の前に break しているため、「東京都」しか表示されませんでした。
このように continue と break は for(foreach) 文の中で使用することが多いので、セットで使えるようになっておきましょう。
foreach文は配列処理を簡潔に記述できる便利な構文ですが、扱う変数の状態によっては意図しない警告が発生する場合があります。
特に、配列ではない値や未定義の変数を対象にforeachを実行するとエラーになるため、処理前に対象データの内容を確認しておくことが重要です。実務では、外部データや条件分岐の結果を扱う場面も多いため、変数が正しく配列として準備されているかを意識することで、より安全で安定した処理を実装できます。
まとめ
ここでは foreach 文の、
- for 文との違い
- 基本構文と実用例
- index の取得方法
- 連想配列や多次元配列での使用方法
- foreach 文が使えない場合
- continue と break について
などについて解説しました。foreach 文は配列に対して繰り返し処理を設定することができる便利な処理で、開発でも使用頻度がとても高いです。これを機に foreach 文を使いこなせるようになり、レベルアップしてみてはいかがでしょうか。
初めは構文を見ながらで構いませんので、徐々にできるようになっていきましょう!
PHPの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、PHPに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。
