【やさしいPHP】foreach文の基礎を知ってかんたんな応用を試してみる

こんにちは。このところ何かと眠いムラマツです。体が現実逃避したがっているのか、ただただ疲れているのかは、自分の気持ち次第だと思っています!

さて今回はPHPのforeachについての解説です。foreachは結構使えるコードで、特に大量にある情報を取り出す際に用いるのに必ずと言っていいほど出てくる構文なのです。

そんなforeachの

  • かんたんな説明
  • 書き方・使い方の基礎
  • これさえ押さえておけばある程度は使えるようになるサンプル文
  • htmlにPHPを埋め込んで表を作る

を分かりやすく解説していきます。

目次

foreach文とは

shutterstock_1061638286

画像:shutter stock

foreach文はちょっと特殊な構文で、かんたんに言ってしまえば、配列+繰り返し(for)文をしたようなものです。配列はそれぞれ0からの番号をつけられた箱の中に1つずつ、物や値(要素)を入れてまとめられているようなイメージです。

foreachは配列の時に使えるループ処理で、配列の中に入っている要素の数分、繰り返し処理をしてくれます。構文の書き方は一次元配列と連想配列の2種類あります。

一次元配列

foreach ($array as $value){
実行処理文
}

連想配列

foreach ($array as $key => $value){
実行処理文
}

$arrayは配列、$valueは$arrayに入っている要素、$keyは配列の番号を意味します。では実際の書き方については次に説明していきましょう。

foreach文の書き方・使い方

配列を取り出す

まず配列$bagの中に買い物をした、卵、牛乳、トマト、キャベツ、リンゴ、オレンジを入れ、foreachでそれぞれを取り出します。

<?php
$bag = ['卵','牛乳','トマト','キャベツ','リンゴ','オレンジ'];

foreach ($bag as $value){
    echo $value. '<br/>';
}
?>

出力結果:

卵
牛乳
トマト
キャベツ
リンゴ
オレンジ

foreach ($bag as $value)で$bagの中に入っている要素を$valueに代入しています。そしてechoは出力をするコードとなるので、echoで$valueに入っている要素を1つずつ取り出しています。

‘<br/>’は改行の意味になりますので、1つの要素が取り出されたら改行がされるようになっています。$bagの中に入った物が1つずつ取り出され、改行されているのが分かりますね。

連想配列を取り出す

連想配列は番号の代わりに名前を付けて、その箱の中に要素を入れていくイメージです。

<?php
$bag = [
        'リスト1' => '卵',
        'リスト2' => '牛乳',
        'リスト3' => 'トマト',
        'リスト4' => 'キャベツ',
        'リスト5' => 'リンゴ',
        'リスト6' => 'オレンジ'
    ];

foreach ($bag as $key => $value){
    echo '買い物'. $key. 'つ目は、'. $value. 'です。<br/>';
}
?>

出力結果:

買い物リスト1つ目は、卵です。
買い物リスト2つ目は、牛乳です。
買い物リスト3つ目は、トマトです。
買い物リスト4つ目は、キャベツです。
買い物リスト5つ目は、リンゴです。
買い物リスト6つ目は、オレンジです。

ここで箱の名前「リスト~」が$keyに代入され、$valueに要素が代入されています。なお、echoの後の出力したい文字列と変数を一緒に書く場合は、ドット「.」でつなげるのを忘れないようにしましょう。

foreach文をもうちょっと詳しく知る

foreachを使っていて

繰り返しで取り出す際にある要素をスキップしたい
あるところまでの途中で終了させたい

などが出てくると思います。そういった場合はどうするのかや、PHPとよく一緒に使われるhtmlに組み込んで実際に表を作ってみることで、foreach文を使えるようにしていきましょう。

breakとcontinue

繰り返し処理をしてくれるfor分やwhile文でも使われる、breakとcontinueでは、foreach文でも使うことができます。

それぞれの違い:

  • breakは繰り返しを中断する
  • continueは繰り返しの途中でスキップをする

それぞれの使い方:

繰り返しを途中でやめるのも、飛ばすのも、それぞれを使うのと同時に、条件分岐のif文(もし~であれば実行する)もforeach構文の中で使っていきます。

break:繰り返しを途中で中断する。一次元配列

<?php
$profile = [
            '名前',
            '性別',
            '職業',
            '年齢',
            '住所',
            '電話番号'
           ];
            
foreach ($profile as $value) {
    if ($value == '年齢') {
       break;
    }
    echo $value. '<br/>';
}
?>

出力結果:

名前
性別
職業

連想配列

<?php
$profile = [
            '名前' => 'サンプル 太郎',
            '性別' => '男性',
            '職業' => '会社員',
            '年齢' => '28歳',
            '住所' => '東京都○○区○○1-1-101',
            '電話番号' => '03-1111-1111'
           ];
            
foreach ($profile as $key => $value) {
    if ($key == '年齢') {
       break;
    }
            echo $key. ':'. $value. '<br/>';
}
?>

出力結果:

名前:サンプル 太郎
性別:男性
職業:会社員

流れ:

プロフィールという名前の配列を作り、要素である名前や性別などを入れます。

$profile = [
           '名前' => 'サンプル 太郎',
           '性別' => '男性',
           '職業' => '会社員',
           '年齢' => '28歳',
           '住所' => '東京都○○区○○1-1-101',
           '電話番号' => '03-1111-1111'
           ];

foreach内で$valueに要素を代入します。foreachを使ってそれぞれを取り出したいが、今は年齢から下(住所、電話番号)を表示させたくないとします。

foreach ($profile as $key => $value) {
    if ($key == '年齢') {
                break;
    }

if文とbreakを使って「もし$valueが年齢だった場合、中断する」という命令を出します。ここの$value == ‘年齢’の「==」はイコールという意味になります。処理後、echoを使って$valueに代入されている要素を取り出します。

echo $key. ':'. $value. '<br/>';

break文は中断をしたいところ(ここでは「年齢」)をif文の中に書くようになります。もし職業から中断したい場合は、if文の中は$value == ‘職業’となります。

continue文:途中スキップする。一次元配列

<?php
$profile = [
            '名前',
            '性別',
            '職業',
            '年齢',
            '生年月日',
            '住所',
            '電話番号'
            ];
            
foreach ($profile as $value) {
    if ($value == '年齢') {
       continue;
    }
    echo $value. '<br/>';
}
?>

出力結果:

名前
性別
職業
生年月日
住所
電話番号

流れはbreakとほぼ同じようになります。if文とcontinueを使って「もし$valueが年齢だった場合、スキップする」という命令を出しています。

連想配列

<?php
$profile = [
            '名前' => 'サンプル 太郎',
            '性別' => '男性',
            '職業' => '会社員',
            '年齢' => '28歳',
            '生年月日' => '1990年 1月 1日',
            '住所' => '東京都○○区○○1-1-101',
            '電話番号' => '03-1111-1111'
            ];
            
foreach ($profile as $key => $value) {
    if ($key == '年齢' || $key == '生年月日') {
       continue;
    }
echo $key. ':'. $value. '<br/>';
}
?>

出力結果:

名前:サンプル 太郎
性別:男性
職業:会社員
住所:東京都○○区○○1-1-101
電話番号:03-1111-1111

ここでは要素2つをスキップさせました。2つスキップさせる時はif文の中で

「もしもし$valueが年齢だった場合、または$valueが生年月日だった場合、スキップする」という文にするので、「または(OR)」の意味を持つ「 || 」を使います。

もし名前と生年月日と住所をスキップさせたいというときは $key == ‘名前’ || $key == ‘生年月日’ || $key == ‘住所’ と書きます。

foreach文を使って表を作る

もう少し実践的にforeach文を使ってみましょう。PHPはhtmlと一緒に使われることが多いため、htmlにPHPを組み込む形でプロフィールの表を作っていきます。

foreachでは表の中に値や要素を入れるのによく書かれるコードなので、サンプルコードを見て理解しておくだけでもいざと言うときに役に立ちますよ。

<!DOCTYPE html> <!--1-->
<html> <!--2-->
<body align="center"> <!--3-->

<!--4-->
  <?php 

  $ranking = [
             '1位' => '佐藤',
             '2位' => '鈴木',
             '3位' => '高橋',
             '4位' => '田中',
             '5位' => '伊藤',
             '6位' => '渡辺'
             ];
  ?>

 <table border="2" align="center"> <!--5-->
  <caption>苗字ランキング</caption> <!--6-->
  <tr bgcolor="#CCFFFF"> <!--7-->
   <th width="80">位</th> <!--8-->
   <th width="200">苗字</th> <!--8-->
  </tr>
  <?php foreach ($ranking as $number => $name){ ?> <!--9-->
   <tr>
    <td>
     <?=$number ?> <!--10-->
    </td>
    <td>
     <?=$name. 'さん' ?> <!--11-->
    </td>
   </tr>
  <?php } ?> <!--12-->
 </table>
</body>
</html>

出力結果:

出力結果2

サンプルプログラムにある「<!– –>」は1行分のコメントを意味します。「<!– –>」がついていることにより、ブラウザには表示されません。

コードの中でのみのコメントを表示させたいときに使いコメントアウトと呼ばれています。コメントアウトの番号に沿って解説していきましょう。

1.htmlの場合は、バージョン~のhtmlで作成していますよ、という宣言をしなければいけません。最新のバージョン(html5)の宣言は<!DOCTYPE html>と書き、一番初めに書きます。

<!DOCTYPE html> <!--1-->

2. 開始タグ:<html>と、終了タグ:</html>を書き、この間に色々なタグやコードを書いていきます。

<html> <!--2-->

3. テーブル(表)を今回は<body>タグの中に書いていくことにして、文字の表示が真ん中になるよう<body>タグの中にalign=”center”を書きました。

<body align="center"> <!--3-->

4. <?php?>タグを持ってきて、その中に連想配列を書きます。

<?php <!--4-->
$ranking = [
           '1位' => '佐藤',
           '2位' => '鈴木',
           '3位' => '高橋',
           '4位' => '田中',
           '5位' => '伊藤',
           '6位' => '渡辺'
           ];
?>

5. テーブルを作成するのに<table>タグを使います。表の枠線の太さを「2」、テーブル自体の表示を真ん中にするために、align=”center”をタグの中に書きます。

 <table border="2" align="center"> <!--5-->

6. <caption>タグはテーブルの見出しです。ここでは苗字のランキングをテーブルを表示するのでそのタイトルとして「全国苗字ランキング」とつけました。

<caption>全国苗字ランキング</caption> <!--6-->

7. <tr>タグはテーブルの「レコード(行)」をまとめるタグです。1行目は行の名前を入れるので、背景に色をつけるため、バックグラウンドカラーを意味するbgcolorにカラーコード(色の番号)を入れます。

<tr bgcolor="#CCFFFF"> <!--7-->

ここでは薄い水色ですが、他にも薄いピンクは#FFCCFFなどカラーコードが決まっています。カラーコードは調べると出てきますよ。

8. <th>タグはテーブルの見出しを意味し、文字が太く表示されます。

<th width="80">位</th> <!--8-->
<th width="200">苗字</th> <!--8-->

ここでは1列目「位」と2列目「苗字」を見出しにするため、それぞれを<th>タグで囲っています。また列の幅を指定するwidth=”~”「~」の中にはピクセル(画素)数を入れます。

9. 再度<?php?>タグをもってきてここでforeach文を書きます。

<?php foreach ($ranking as $number => $name){ ?> <!--9-->

<tr>タグで行をまとめ、表の値・要素を意味する<td>タグで1列目にランキング、2列目に苗字+「さん」が表示されるようにします。

10. $numberにランクを代入します。

<?=$number ?> <!--10-->

「<?=」はPHPのechoを略したタグで<?php echo と同じです。

11. $nameに苗字を代入し、苗字の後に「さん」をつけるようにしました。

<?=$name. 'さん' ?> <!--11-->

12. foreach分の波カッコ「{ }」の終わりを忘れないように入れます。

<?php } ?> <!--12-->

そして、それぞれのタグを閉めるのを忘れないようにしましょう。ここではPHPの中で要素を代入して表示させていますが、実際にはたくさんのデータを取り扱うようになります。

その情報を全てデータベースに入れ、そこから情報を取り出すのですが、そこでforeachがよく使われます。

まとめ

foreachでは配列を取り出すために繰り返し処理を行って、それぞれの要素(情報)を取り出してくれる構文です。

breakやcontinueも使って便利に情報を取り出すことも可能で、とても使いやすく、よく使われるので、ぜひ覚えて使っていけるようにしていくといいかもしれませんね。

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次