みなさんPHPにおける「foreach」はご存知でしょうか?
配列やオブジェクト要素を簡単に処理できるforeachは、PHPの習得に必須な知識です。
しかし「foreachって名前だけ知ってるけど詳しくはわからない」「何となくわかるけど、どういう時に使ったらいいかわからない」と思う初心者もいるでしょう。
今回はforeachの基本的な使い方から実践的なテクニック、さらにハマりやすい注意点までしっかり解説していきますのでよかったら最後までご覧ください。
そもそもPHPって何ができるの?PHPについて詳しくまとめた記事があるので、ぜひご覧ください!

foreachとは?


PHPの「foreach」ってなんですか?
foreachはPHPにおける繰り返し処理の一種で、配列やオブジェクトの要素を順次処理するために使われます。
つまり、配列に収めたキーや値を、順番に取り出していく便利な手法です。


for文やwhile文と比較して、インデックスを管理する必要がなく、よりシンプルに記述できるのが特徴です。
特に配列やオブジェクトの全要素に対して何らかの処理を行いたい場合に適しています。
foreachの基本的な使い方





1つずつ取り出していく方法ということはわかりました!
では、基本的なforeachの使い方が知りたいです。
ここではforeachにおける、基本的な構文を2つに分けて説明します。
- 配列によるforeach
- 連想配列によるforeach
foreachはPHPの配列と相性が良いデータ構造であり、添字配列の場合、要素の値だけを取り出して処理することが可能です。
一方連想配列では、キーと値の両方を取得することができます。
次で実際のforeachの構文を詳しく説明します。
PHPの配列って何?詳しく解説した記事もあるので、是非ご覧ください!


配列によるforeach
まずは基本的な配列によるforeachの構文を紹介します。
シンプルなforeachの構文は、以下の書き方になります。
foreach (配列やオブジェクト as 変数) {
// 処理内容
}
この構文を用いて、シンプルに処理内容を書いてみましょう。
$fruits = ['りんご', 'バナナ', 'オレンジ']; // りんご、バナナ、オレンジを配列に収める
foreach ($fruits as $fruit) {
echo $fruit . '<br>'; // りんごから順に取り出していく
}
// 実行結果
りんご
バナナ
オレンジ
このように、foreachは配列に収めた要素を順番に取り出していくことができます。
連想配列によるforeach
一方連想配列では、キーと値の両方を取得することができます。
$person = [
'name' => '山田太郎',
'age' => 30,
'job' => 'プログラマー'
]; // キーと値を配列にセット
foreach ($person as $key => $value) { // $keyが配列のキー、$valueが配列の値に当たる
echo $key . ': ' . $value . '<br>';
}
// 実行結果
name: 山田太郎
age: 30
job: プログラマー
もちろん連想配列だとしても、値のみ取り出すことが可能です。
foreach ($person as $value) {
echo $value . '<br>';
}
// 実行結果
山田太郎
30
プログラマー
また、配列の中に配列がある多次元配列は、foreachをネストして処理することもできます。
$students = [ // 多次元配列を設定
'1組' => ['佐藤', '鈴木', '高橋'],
'2組' => ['田中', '伊藤', '渡辺'],
'3組' => ['山本', '中村', '小林']
];
foreach ($students as $class => $names) {
echo $class . 'の生徒:<br>'; // まずはクラスを順に習得
foreach ($names as $name) { // 次に各クラスに在籍する名前を順に習得
echo '- ' . $name . '<br>';
}
echo '<br>';
}
// 実行結果
1組の生徒:
- 佐藤
- 鈴木
- 高橋
2組の生徒:
- 田中
- 伊藤
- 渡辺
3組の生徒:
- 山本
- 中村
- 小林



foreachの使い方がなんとなくわかりました!
でもどういう時に使うんだろう?
例えば顧客リストを作成するとします。
「①名前:○○」「②名前:○○」「③:○○」…と1から手作業で入力するのは手間がかかるうえ、修正が発生した時も修正箇所を探さなければいけません。
しかし配列に名前を収めてforeachを使って一覧表を作ることで、入力する手間が省き、修正が発生しても配列を修正するだけで完了します。



foreachはプログラム作成において必須な手法なんですね。
オブジェクトとforeachの使い方





配列とforeachの関係性がよくわかりました!
foreachは他の場面でも活躍はするのでしょうか?
foreachはオブジェクトにも使用できます。
以下はオブジェクトのプロパティをループ処理するforeachの構文です。
class Person { // Personというクラス(設計図を作成
public $name = '山田太郎';
public $age = 30;
public $job = 'プログラマー';
}
$person = new Person(); // オブジェクトを作成
foreach ($person as $property => $value) {
echo $property . ': ' . $value . '<br>';
}
// 実行結果
name: 山田太郎
age: 30
job: プログラマー
ここの「$person = new Person()」は、次のような情報をもつオブジェクトになります。
$person = [
'name' => '山田太郎',
'age' => 30,
'job' => 'プログラマー',
]
これは実際はオブジェクトですが、イメージとしては連想配列のようにプロパティを持っています。
そしてforeachを使って、順番にキーと値を順番に取り出していっています。



ただし、アクセス修飾子privateやprotectedのプロパティは取得できないので注意が必要です。
クラス内のプロパティやメソッドのアクセス範囲を制限する機能であり、3つに分けられます。
- public:どこからでもアクセス可能(foreachで取得できる)
- protected:そのクラスと子クラスからのみアクセス可能(foreachでは取得できない)
- private:そのクラス内からのみアクセス可能(foreachでは取得できない)
foreachのハマりやすい注意点





PHPのforeachについて、だんだんとわかってきました!
最後にforeachを使うときの注意点を知っておきたいです。
foreachを使う上でのハマりやすい注意点は、以下4点になります。
- 参照渡し(&)による思わぬ副作用
- foreachのメモリ使用量
- 配列の要素を変更する際の注意
- 空の配列に対するforeachの挙動
次で詳しく説明します。
参照渡し(&)による思わぬ副作用
foreachで参照渡し(&)を使用すると、思わぬ副作用を起こすことがあります。
PHPの参照渡し(&)とは、変数の「中身(値)」ではなく「場所(キー)」を渡すことです。
これにより、渡した先で変更された内容が元の変数にも反映されるようになります。
具体例を見てみましょう。
$array = [1, 2, 3]; // 配列をセット
foreach ($array as &$value) {
$value *= 2; // 要素を取り出し、1つずつ×2していく
}
// ここで$valueは最後の要素への参照のまま
$value = 10; // $array[2]が10に変わってしまう
print_r($array);
// 実行結果
Array
(
[0] => 2
[1] => 4
[2] => 10
)
参照渡しを使った後は、unset()で参照を解除するようにしましょう。
unset関数とは、指定した変数や配列の要素などの削除や解除をするときに使用する関数です。
$array = [1, 2, 3];
foreach ($array as &$value) {
$value *= 2;
}
unset($value); // 参照を解除
print_r($array);
// 実行結果
Array
(
[0] => 2
[1] => 4
[2] => 6
)
foreachのメモリ使用量
foreachは大きな配列の場合、メモリ使用量に注意が必要になります。
$largeArray = range(1, 100000); // 1から100000までの配列を作成
foreach ($largeArray as $value) {
// この処理は、メモリを大量に消費します
}



メモリ使用量が大きくなるとエラーになる原因にもなります。
注意して使用しましょう。
配列の要素を変更する際の注意
foreachのループ中に処理している配列自体を変更すると、予期せぬ動作を引き起こすことがあります。
例えばforeach中に要素を1つ削除してみましょう。
$array = [1, 2, 3, 4, 5]; // 配列を作成
foreach ($array as $key => $value) { //キーと値を順に取り出す
if ($value === 3) {
unset($array[$key]); // 値が3の時、要素を削除する
}
}
print_r($array);
// 実行結果
Array
(
[0] => 1
[1] => 2
[3] => 4
[4] => 5
) // キー2が削除される



ループ中による関数は慎重に使用する必要がありますね。
空の配列に対するforeachの挙動
空の配列をforeachで処理してみましょう。
$emptyArray = []; // 空の配列を用意
foreach ($emptyArray as $value) { // foreachの処理は行われない
echo "この行は表示されません";
}
echo "ループ終了"; // この行だけが表示される
この場合エラーは発生せず、ループ内の処理も実行されません。



エラーは発生しませんが、処理が行われないので見落としてバグにつながる原因にもなります。
空の配列のときはforeachを行わないようなプログラムを組むとよいでしょう。
まとめ
今回はPHPのforeachの使い方や、ハマりやすい注意点を紹介しまし。
foreachはPHPで配列やオブジェクトを処理するための非常に強力なツールです。
基本的な使い方をマスターし、注意点を把握することで、より効率的で読みやすいコードを書くことができます。
- 配列やオブジェクトの全要素に対して同じ処理を適用したい場合に最適
- キーと値の両方にアクセスできる
- ネストさせることで複雑なデータ構造も簡単に処理可能
- 参照渡しや配列の変更時、大規模なデータ処理は注意が必要
foreachを使いこなして、PHPプログラミングの効率化に貢献できれば幸いです。
PHPをもっと詳しく学習したい!将来はPHPを使ってアプリを開発したい!DMM WEBCAMPでは「PHP/Lalavelコース
\ PHPをマスターしよう!/