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]
で初期化し、この変数$arr
をforeach
文に渡します。
foreach
文では$arr
に対して変数$val
で配列の要素を受け取ります。
その変数$val
をecho
で画面に出力します。
<?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
のように参照にすることでその要素自体の値を変更することが可能です。
↓のコードでは配列$arr
をforeach
文で回す時に、$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
にはcat
やdog
などの動物を表す文字列が入っています。
これらの文字列の出現数を数えて、そのカウントを連想配列に保存します。
<?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
文で配列のあとに書くべきキーワードを答えよ
- in
- as
- is
Q2: foreach
文は配列のどこから参照を始めるか答えよ
- 先頭から
- 真ん中から
- 後方から
Q3: endforeach
はどういう時に使われるか答えよ
- HTMLの描画をphpブロック外で行う時
- HTMLの描画をechoで行う時
- HTMLの描画をprintfで行う時
正解
Q1: 2
Q2: 1
Q3: 1