この記事ではPHPのforeach文について解説します。foreach文について具体的には↓の内容を見ていきます。ループ文とはなにか?foreach文の書き方foreach文の構造普通の配列を回す連想配列を回す普通の配列に参照を使うネストした配列を..." /> PHPのforeach文の書き方: 配列をループ文で回す

ユーニックス総合研究所

  • home
  • archives
  • php-foreach

PHPのforeach文の書き方: 配列をループ文で回す

  • 作成日: 2020-08-26
  • 更新日: 2023-12-24
  • カテゴリ: PHP

foreach文の書き方

PHPにはforeach文という配列をループで回すのに特化した文があります。
これを使うと簡単に配列をループで回すことが出来ます。

例えば↓のように使います。

<?php  

$arr = [1, 2, 3];  

foreach ($arr as $val) {  
    echo "$val\n";  
}  

?>  

この記事ではPHPのforeach文について解説します。
foreach文について具体的には↓の内容を見ていきます。

  • ループ文とはなにか?
  • foreach文の書き方
  • foreach文の構造
  • 普通の配列を回す
  • 連想配列を回す
  • 普通の配列に参照を使う
  • ネストした配列をlist()で展開する
  • 使用例
  • 問題

ループ文とはなにか?

プログラミング言語における「ループ文」とはなんでしょうか?
ループ文とは、ループ処理を制御する文です。
代表的な文がfor文やwhile文などで、これらはプログラミング言語においてループ、つまり「繰り返し」処理を制御するために使います。

プログラミングで制作するプログラムの一番の目的は、「大量のデータ」を高速に処理することです。
たとえば10000件あるデータを人の手で1つずつ丁寧にやっていては、膨大な時間がかかってしまいますが、プログラムにループ処理を行わせることでそれらの大量のデータを高速に処理することが可能になります。

このようにプログラミング言語におけるループ文は、プログラムの開発に無くてはならないものです。
ループ文がないプログラミング言語はプログラミング言語とは言えないでしょう。

PHPにももちろんループ文があります。
PHPにはfor文やwhile文といった代表的なループ文がそなわっています。
そしてこの記事で紹介するforeach文もループ文の1つです。

foreach文は、配列や連想配列を処理するのに特化したループ文です。
これを使うことで配列や連想配列を簡単に処理することが出来ます。

foreach文の構造

foreach文は↓のような構造を持っています。

foreach (配列 as 値) {  
    処理  
}  

または  

foreach (配列 as キー => 値) {  
    処理  
}  

普通の配列を回す時は前者、連想配列を回す時は後者の構造を使います。
foreach文は配列の先頭から順に要素を参照していきます。

また、上記のforeach文はそれぞれ次のエイリアスを持っています。

foreach (配列 as 値):  
    処理  
endforeach;  

または  

foreach (配列 as キー => 値):  
    処理  
endforeach;  

これらのエイリアスはHTMLなどのコンテンツを描画したい時に使います。
たとえば↓のようにです。

<?php foreach ([1, 2, 3] as $el): ?>  
<p><?= $el ?></p>  
<?php endforeach; ?>  

↑のコードを実行すると↓のような出力になります。

<p>1</p>  
<p>2</p>  
<p>3</p>  

普通の配列を回す

普通の配列をforeach文で回すには↓のようにします。
変数$arrを配列[1, 2, 3]で初期化し、この変数$arrforeach文に渡します。
foreach文では$arrに対して変数$valで配列の要素を受け取ります。
その変数$valechoで画面に出力します。

<?php  

$arr = [1, 2, 3];  

foreach ($arr as $val) {  
    echo "$val\n";  
}  

?>  

出力結果。

1  
2  
3  

配列[1, 2, 3]の先頭の要素から順に参照され、要素が$valに格納されていっているのがわかります。
このようにforeach文を使うと配列の走査を簡単に書くことが出来ます。
普通のfor文と比べてみましょう。

<?php  

$arr = [1, 2, 3];  

for ($i = 0; $i < count($arr); $i++) {  
    echo "$arr[$i]\n";  
}  

?>  

↑は普通のfor文で同じようなコードを書いた場合です。
foreach文と比べると、foreach文のほうは$iという添え字が隠蔽されているのがわかります。
このように添え字を隠蔽することで、ループ文がとてもシンプルになります。
また添え字分のコードを減らすことでミスやバグも減らせます。

連想配列を回す

連想配列をforeach文で回すには↓のようにします。

<?php  

$arr = [  
    "cat" => "nyan",  
    "dog" => "wan",  
    "bird" => "kii",  
];  

foreach ($arr as $key => $val) {  
    echo "$key => $val\n";  
}  

?>  

出力結果。

cat => nyan  
dog => wan  
bird => kii  

foreach文は連想配列の先頭の要素から順に参照します。
$keyに連想配列のキー、$valにキーの値が格納されます。

foreach文は連想配列をループで回したい時にも適しています。
↑のように非常にシンプルに連想配列を走査することができます。

普通の配列に参照を使う

普通の配列をforeach文で回すとき、$valを参照にすることが出来ます。
&$valのように参照にすることでその要素自体の値を変更することが可能です。

↓のコードでは配列$arrforeach文で回す時に、$arrの要素を受け取る変数に&をつけて&$valとしています。
こうすることでこの変数$valは、配列$arrの要素を参照で受け取ることが可能になります。

<?php  

$arr = [1, 2, 3];  

foreach ($arr as &$val) {  
    $val *= 2;  
}  

print_r($arr);  

?>  

出力結果。

Array  
(  
    [0] => 2  
    [1] => 4  
    [2] => 6  
)  

参照で要素を受け取るということは、↑のように要素の値をforeach文の中で変更できるということです。
つまり普通のforを使い添え字を使って配列の要素を変更しなくても、foreach文でこと足りるわけですね。
配列内の要素の値を変更したいというケースはけっこう多いものです。
foreach文で「あれ? 要素の値を変更したいんですけど!」となったら、この参照の存在を思い出してみてください。

↑のコードから、PHPの整数はオブジェクトであることが伺えます。

ネストした配列をlist()で展開する

PHP 5.5から、ネストされた配列をforeachで回す時に、asのあとにlist()を書くことでネストした配列自体を展開することができるようになりました。

<?php  

$arr = [  
    [1, 2],  
    [3, 4],  
];  

foreach ($arr as list($first, $second)) {  
    echo "first[$first] second[$second]\n";  
}  

?>  

出力結果。

first[1] second[2]  
first[3] second[4]  

foreach文内の要素の受け取りにlist($first, $second)という風にかいています。
これは配列$arrの要素を$first$secondに展開するということです。

先頭の要素のみを参照することもできます。

<?php  

$arr = [  
    [1, 2],  
    [3, 4],  
];  

foreach ($arr as list($first)) {  
    echo "first[$first]\n";  
}  

?>  
first[1]  
first[3]  

従来の方法と比べてみましょう。
このような配列$arrを回す時は今までは↓のようにコードを書いていました。

<?php  

$arr = [  
    [1, 2],  
    [3, 4],  
];  

foreach ($arr as $el) {  
    $first = $el[0];  
    $second = $el[1];  
    echo "first[$first] second[$second]\n";  
}  

?>  

なんとlist()を使うことで2行も節約できますね。
foreach文が100個あったら200行のコスト削減です。
これは嬉しい限りです。

使用例

foreach文の使用例です。
具体的なケースを想定したコードを掲載します。

HTMLをforeach文で生成する

配列の値に応じて動的にHTMLを生成します。

<?php  

$arr = [1, 2, 3];  
foreach ($arr as $val): ?>  
<p>Count <?= $val ?></p>  
<?php endforeach;  
?>  

出力結果。

<p>Count 1</p>  
<p>Count 2</p>  
<p>Count 3</p>  

配列の要素に応じてループを回しHTMLを生成するのはPHPといえばこれと言う感じでしょうか。
かなりプリミティブな処理ですが、使うところは多いかと思います。

配列内の値の総和を得る

配列内の整数の総和を得ます。

<?php  

$arr = [1, 2, 3, 4];  
$sum = 0;  

foreach ($arr as $val) {  
    $sum += $val;  
}  

echo "$sum\n";  

?>  

出力結果。

10  

foreach文で配列内の要素の値の総和を取るのは↑のように簡単です。
ちなみに配列の総和を取る関数はすでにPHPにあるので、↑のようなコードを書かなくても↓のようにすれば用は足ります。

<?php  

$arr = [1, 2, 3, 4];  
echo array_sum($arr) . "\n";  

?>  

出力結果。

10  

統計を取る

配列をforeach文で回して統計を取ります。
配列$arrにはcatdogなどの動物を表す文字列が入っています。
これらの文字列の出現数を数えて、そのカウントを連想配列に保存します。

<?php  

$arr = ['cat', 'dog', 'bird', 'cat'];  
$stat = [];  

foreach ($arr as $val) {  
    if (array_key_exists($val, $stat)) {  
        $stat[$val]++;  
    } else {  
        $stat[$val] = 1;  
    }  
}  

print_r($stat);  

?>  

出力結果。

Array  
(  
    [cat] => 2  
    [dog] => 1  
    [bird] => 1  
)  

普通の配列をforeach文で回すのは簡単なことです。
添え字を書く必要もありません。
気分がハッピーになりますね。

おわりに

PHPのforeach文について解説しました。
for文やwhile文と合わせて押さえておきたいループ文の1つです。
foreach文を使えばコードが少しカッコよくなるかもしれません。

🦝 < ループ文はプログラミング言語の帝王

問題

Q1: foreach文で配列のあとに書くべきキーワードを答えよ

  1. in
  2. as
  3. is

Q2: foreach文は配列のどこから参照を始めるか答えよ

  1. 先頭から
  2. 真ん中から
  3. 後方から

Q3: endforeachはどういう時に使われるか答えよ

  1. HTMLの描画をphpブロック外で行う時
  2. HTMLの描画をechoで行う時
  3. HTMLの描画をprintfで行う時

正解

Q1: 2
Q2: 1
Q3: 1