RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

PHP foreach構文 使い方【基本のキ】

PHP入門者・プログラミング初心者向けにPHPでforeach構文の使い方を解説します。foreach構文は、配列の要素の数だけ繰り返し処理を行います。

foreachの基本的な解説から、連想配列での使い方繰り返しの途中で処理をスキップする方法、おまけとしてforeachに代わる、スマートに書けるPHPのメソッドの紹介をします。

目次

foreach構文とは

foreach文配列に含まれる要素の値をループで順番に取り出して処理したい場合に便利な繰り返し構文です。

配列は複数のデータをまとめて格納できる変数です。

※配列については下記ページでわかりやすい解説があります。

PHPの配列機能のまとめ - RAKUS Developers Blog | ラクス エンジニアブログ


繰り返しの処理を行う他の構文は、PHPではfor文やwhile文などがありますが、foreach構文は繰り返しを終了する条件を記述する必要がなく、それらに比べて簡潔に記述できます。

foreachは配列の要素の数だけ繰り返し処理を実行したら、ループが終了するという特徴があります。


foreach構文を実際に使ってみよう

構造は次のようになっています。

foreach (要素を取り出す配列 as 配列から取り出した要素を格納する変数){
  実行する処理※配列から取り出した要素を格納する変数が使用できる;
}

要素を取り出す配列:ループで順番に中身が取り出される配列です。その配列の要素の数だけループが繰り返されます。

配列から取り出した要素を格納する変数:ループ1回で配列内にある1つの要素がこの変数に代入されます。毎ループ同じ名前の変数に、配列の中の1つの要素が格納されます。

サンプルプログラムで具体的に動きを見てみましょう

<?php
$animalList = ["犬", "猫", "うさぎ"];

foreach ($animalList as $animal){
  print $animal."<br>";
}
?>

このときの出力結果は下記のようになります。

犬
猫
うさぎ

先ほどの処理の流れは以下の通りです。

1. 「$animalList」配列に「犬」「猫」「うさぎ」を代入

---ループ開始(「犬」、「猫」、「うさぎ」の合計3回繰り返す)---

 -ループ1回目-
 2. foreach文冒頭で「$animalList」から「犬」を取り出し「$animal」に代入
 3. 「print $animal;」で「犬」を出力

 -ループ2回目-
 4. foreach文冒頭で「$animalList」から「猫」を取り出し「$animal」に代入
 5. 「print $animal;」で「猫」を出力

 -ループ3回目-
 6. foreach文冒頭で「$animalList」から「うさぎ」を取り出し「$animal」に代入
 7. 「print $animal;」で「うさぎ」を出力

---ループ終了---


使用時の注意

PHPは変数の有効範囲であるスコープが他言語と異なることがあり、その影響でハマるケースもあります。

PHPには条件分岐内やループ内のブロックスコープがないため、上の例では$animalはループを抜けた後でも値が入ったままです。

ループ内でセットした変数についても同様に、ループを抜けた後でも値が入っています。

他の言語とは異なる動きになるため、注意が必要です。

参考:スコープ - Wikipedia

参考:PHP: 変数のスコープ - Manual


連想配列での使いかた

上記では一次配列を基にループをさせていましたが、連想配列でも同じくforeach構文を使用できます。

連想配列は、下記のようにキーと値のペア(キーバリューストア)が格納されています。

$animalList = ["dog" => "犬", "cat" => "猫"]

この場合、キーは「dog」「cat」、は「犬」「猫」となります。

サンプル

<?php
$animalList = ["dog" => "犬", "cat" => "猫","rabbit" => "うさぎ"];
foreach($animalList as $key => $value) {
    print $key."は" . $value."という意味です<br>";
}
?>

こちらを実行してみると、以下のような結果となります。

dogは犬という意味です
catは猫という意味です
rabbitはうさぎという意味です


ループの途中で処理をスキップする方法

foreach等の繰り返し処理の途中で、その繰り返しを抜けたりその回の繰り返しを飛ばして次の繰り返しを行ったりしたいときがあります。

「繰り返しを抜ける」というのは、例えば、配列の中に"dog"という文字列が1つあり、それを検索したい場合です。

"dog"が見つかったら目的を果たしたことになり、それ以降の繰り返し処理の中での検索は意味がないので、そのループ自体を抜けたほうが高速で低負荷な処理が実現できます。

「その回の繰り返しを飛ばして次の繰り返しを行う」というのは、保存処理で一例を挙げると、値が入っている場合は保存して、値が入っていない場合は保存しないといった場合です。値が入っていない場合は、保存をする必要がないため、現在のループをスキップして次のループに移行した方が不要な処理を行わなくて済みます。

そんな時に使えるのがbreak文continue文です。

break文は、繰り返し処理を中断し、繰り返しの中から抜けます。

continue文はその回の処理を飛ばし、次の繰り返し処理へと進めます。

break文continue文は、foreachだけでなく、whileやfor等の他のループでも使用できます。


それでは、実際に動きを見てみましょう。

continue文

foreach ( $fruits as $fruit  ) {
    // 処理A
    contiue;
    // 処理B
}

処理の流れ:foreach開始 → 処理Acontinue(その回のループをスキップ) → 処理A → continue....

この例では処理Bはスキップされて、次のループで処理Aを実行します。


break文

foreach ( $fruits as $fruit  ) {
    // 処理A
    break;
    // 処理B
}
// 処理C

処理の流れ:foreach開始 → 処理Abreak(ループ自体を抜ける) →処理C

処理Aの直後に繰り返し処理を抜けて(終了して)、処理Cを実行します。

while構文やfor構文との違い

foreachはわかったけど、他の繰り返し構文のwhile文やfor文とはどうちがうの?と思われるかもしれません。

ここではforeachwhile、forを比較して、どういう場面で使いやすいのかという解説をしていきます。

これから、同じ結果を出力するコードをforeach、while、forで書き換えてみます。

まずはforeachから

foreach

<?php
$animalList = ["犬", "猫", "うさぎ"];

foreach ($animalList as $animal){
  print $animal."<br>";
}
?>


while

<?php
$animalList = ["犬", "猫", "うさぎ"];
$animalNum = 3; //count()などを使って配列の要素数を数えたほうが変更に強いプログラムになります
$index = 0;
while ($index !== $animalNum) {
    print $animalList[$index]."<br>";
    $index++;
}
?>


for

<?php
$animalList = ["犬", "猫", "うさぎ"];
$animalNum = 2; //count()などを使って配列の要素数を数えたほうが変更に強いプログラムになります
for ($index = 0; $index <= $animalNum; $index++) {
    print $animalList[$index]."<br>";
}
?>


結果

犬
猫
うさぎ



各繰り返しの構文の特徴をまとめると以下のようになります。繰り返し処理を行うときの参考にしてください。

構文 処理に適している条件 特徴
foreahc 配列の全ての要素に対して繰り返し処理を行いたい。 条件式を意識しなくても繰り返し処理ができる。
while 指定した条件の間は、繰り返し処理を行いたい。 条件式のみで繰り返しができるので、フラグで繰り返し処理を管理する場合は向いている。
for 初期値、条件、増減式を指し、指定した条件になるまで繰り返したいとき。 繰り返しの条件を1行で定義できるので、可読性が高い。配列を使わない繰り返し処理に向いている。

ここまでforeach構文を中心に繰り返し処理をみてきましたが、それぞれ得意なことが異なります。目的に合った構文を使えるようになるとコーディングが楽になります。

繰り返し処理はPHPに限らずプログラム初心者のうちはつまずきやすい箇所なので、最初は画面に要素やキーを出力しながらデバッグを行うとわかりやすいです。

参考:PHP: while - Manual

参考:PHP: for - Manual


foreachに代わるループ構文

foreachで繰り返し処理をさせて、その中で任意の処理を書いていくというのはよくあることです。

ですが、実はPHPには標準関数として、便利に配列を処理するarray系の関数が用意されています。

array_xxxxの形のarray系関数を使うことで、foreachで任意の処理を書いていくのと比べると「記述量が減る」「高速処理」「バグの発生を防げる」というメリットがあります。

開発をする上で、配列の処理をスマートに書けると大幅な業務効率アップに繋がるでしょう。

知っているだけで大きな強みになります。今後のためにも、 ループの中で配列を扱うときには、一度調べてみることをお勧めします。

今回はたくさんある中から一例をご紹介しますが、他にもたくさん便利なメソッドがあります。

是非foreach以外の配列ループの世界にも飛び込んでみてください。

参考:PHP: 配列 関数 - Manual


配列の中の数値の合計値を返してくれる array_sum()

//この配列の合計が欲しい場合
$ary = [100, 200, 300];

foreachの場合

$sum = 0;
foreach($ary as $num){
    $sum += $num;
}

echo $sum;
//出力: 600

array_sumの場合

$sum = array_sum($ary);

echo $sum;
//出力: 600

4行が1行になりました。


重複を排除した配列を返してくれる array_unique()

//この配列を ["a", "b", "c"] にしたい場合
$ary = ["a", "b", "a", "c"];

foreachの場合

$uniq_ary = array();
foreach($ary as $str){
    if(!in_array($str, $uniq_ary)){
        $uniq_ary[] = $str;
    }
}

var_export($uniq_ary);

array_uniq()の場合

$uniq_ary = array_unique($ary);

var_export($uniq_ary);

6行が1行になりました。


今回はPHPのforeachの基礎の解説から、発展形のarray系関数を紹介しました。

「配列を制する者はプログラミングを制する」というエンジニア界隈のことわざがあります。

皆さんも、PHPのforeachを使いこなし、配列マスターを目指しましょう。


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.