【PHP】foreach文の書き方と使い方の基本
PHPの基本的な開発環境から、配列の繰り返し処理に必須な`foreach`文の基本を解説します。値やキーの取り出し方、連想配列や多次元配列の処理、`continue`や`break`による制御、参照渡しなど、初心者にも分かりやすい豊富なコード例で、実用的な使い方を網羅的に学べます。
開発環境
- OS: Windows10
- Editor: Visual Studio Code
- PHP: 8.0以降
PHPのforeach文とは
配列やオブジェクトの各要素に対して繰り返し処理を行うための構文です。
PHPのforeach文は、プログラムの中でデータの集まり(配列やオブジェクト)に含まれる一つ一つのデータを取り出して、何らかの処理を行う際に使用されます。例えば、商品リストの配列から全ての商品名を取り出して表示したい場合や、ユーザー情報が格納された配列から各ユーザーのデータを処理したい場合などに大変役立ちます。
foreach文の基本的な使い方
foreach文には主に2つの書き方があります。
1. 配列の「値」だけを取り出す場合
配列の中から各要素の「値」だけを順に取り出して処理する場合の構文です。
1foreach (配列 as 変数名) { 2 // 繰り返し行いたい処理 3 // 変数名には、現在の要素の値が入ります 4}
例: 商品名の配列から各商品名を取り出して表示します。
1<?php 2$fruits = ["りんご", "バナナ", "みかん"]; 3 4foreach ($fruits as $fruit) { 5 echo $fruit . "がリストにあります。\n"; 6} 7?>
上記のコードを実行すると、以下の結果が出力されます。
りんごがリストにあります。
バナナがリストにあります。
みかんがリストにあります。
2. 配列の「キー」と「値」の両方を取り出す場合
配列がキー(識別子)と値のペアで構成されている場合(連想配列など)に、両方を同時に取り出して処理する場合の構文です。
1foreach (配列 as キー変数名 => 値変数名) { 2 // 繰り返し行いたい処理 3 // キー変数名には現在の要素のキーが、値変数名には現在の要素の値が入ります 4}
例: 各商品のID(キー)と商品名(値)を対応付けた配列から、両方を取り出して表示します。
1<?php 2$products = [ 3 "P001" => "ノートPC", 4 "P002" => "スマートフォン", 5 "P003" => "タブレット" 6]; 7 8foreach ($products as $id => $name) { 9 echo "商品ID: " . $id . ", 商品名: " . $name . "\n"; 10} 11?>
上記のコードを実行すると、以下の結果が出力されます。
商品ID: P001, 商品名: ノートPC
商品ID: P002, 商品名: スマートフォン
商品ID: P003, 商品名: タブレット
foreach文の利点
foreach文は、for文のような他の繰り返し構文と比較して、配列の要素数やインデックス(添字)を意識することなく、シンプルに各要素へアクセスできる点が大きなメリットです。これにより、コードが読みやすく、記述ミスも減らすことができます。特に、配列の要素数が動的に変わる場合や、連想配列のように数字以外のキーを持つ配列を扱う場合に非常に便利です。
システム開発において、データの集まりを効率的に処理することは非常に多いため、foreach文はPHPプログラミングの基礎として頻繁に利用される重要な構文です。
サンプルコード
php/chapter09/01.php
このコードは、PHPにおける基本的なforeach文の使い方を示しています。foreach文は、配列のすべての要素に対して、順番に同じ処理を行いたい場合に非常に便利です。
まず、$arrayという変数に、'apple'、'banana'、'cherry'という3つの文字列を要素とする配列が定義されています。
foreach ($array as $value)の部分で、$arrayの各要素を一つずつ取り出し、その要素の値を一時的に$valueという変数に代入します。そして、{}(波括弧)の中で定義された処理が、取り出した要素ごとに実行されます。
この例では、echo $value . "\n";によって、$valueに格納された各要素の値が画面に表示され、その後に改行されます。
実行すると、以下の結果が表示されます。
このように、foreach文を使うと、配列の要素の数に関わらず、すべての要素に対して簡単に繰り返し処理を実行することができます。
01.php1<?php 2// 書き方2 3// foreach (配列 as $key => $value) { 4// // 各要素に対して実行される文 5// } 6// 基本的なforeach文 7$array = ['apple', 'banana', 'cherry']; 8foreach ($array as $value) { 9 echo $value . "\n"; 10} 11
php/chapter09/02.php
前の例では配列の「値」だけを取り出しましたが、このコードではforeach文を使って配列の「キー(添字)」と「値」の両方を取り出す方法を示しています。
ここでのポイントは、foreach ($array as $key => $value)という書き方です。
$arrayの各要素を順番に処理する際、その要素の「キー」(この場合は0, 1, 2といった数字のインデックス)が$keyという変数に、そしてその要素の「値」が$valueという変数にそれぞれ代入されます。
echo "{$key}: {$value}\n";では、$keyと$valueの両方を組み合わせて表示しています。{}を使って変数を文字列の中に直接埋め込む方法は「波括弧構文」と呼ばれ、PHPでよく使われる文字列の結合方法の一つです。
実行すると、以下の結果が表示されます。
このように、foreach文で$key => $valueの形式を使うことで、配列の要素が何番目にあるか(キー)と、その要素の中身(値)の両方を同時に利用した処理が可能になります。
02.php1<?php 2// キーと値の両方を使用するforeach文 3$array = ['apple', 'banana', 'cherry']; 4foreach ($array as $key => $value) { 5 echo "{$key}: {$value}\n"; 6} 7
php/chapter09/03.php
このコードは、PHPの「連想配列」をforeach文でループする方法を示しています。連想配列は、キーに数値ではなく意味のある文字列を使うことができる配列です。
$arrayは、'name'というキーに'Alice'という値、'age'というキーに25という値を持つ連想配列として定義されています。
foreach ($array as $key => $value)の部分は、数値キーの配列の場合と同じ書き方です。しかし、連想配列の場合、$keyには'name'や'age'といった文字列が代入され、$valueにはそれに対応する'Alice'や25という値が代入されます。
echo "User's {$key}: {$value}\n";では、各要素のキーと値を組み合わせて表示しています。
実行すると、以下の結果が表示されます。
連想配列は、データの意味をキーで表現できるため、プログラムの可読性を高めるのに役立ちます。foreach文を使うことで、連想配列のすべての情報(キーと値)を簡単に取り出して処理することができます。
03.php1<?php 2// 連想配列をforeachでループする 3$array = [ 4 'name' => 'Alice', 5 'age' => 25, // ageは数値とするのが一般的です 6]; 7foreach ($array as $key => $value) { 8 echo "User's {$key}: {$value}\n"; 9} 10
php/chapter09/04.php
このコードは、「多次元配列」をforeach文でループする方法を示しています。多次元配列とは、配列の中にさらに配列が入っている構造のことで、複雑なデータを表現する際によく使われます。
$multiArrayは、3つの要素を持つ配列です。そして、その各要素がさらに'name'と'age'というキーを持つ連想配列になっています。これは、複数の人物の情報を管理するような場合に考えられる構造です。
多次元配列を処理するには、foreach文を「ネスト」(入れ子にすること)して使います。
-
外側の
foreach文:foreach ($multiArray as $person)このループでは、$multiArrayから最初の要素(['name' => 'Alice', 'age' => 25]という配列全体)を取り出し、それを$personという変数に代入します。次に2番目の要素、3番目の要素と順に処理します。 -
内側の
foreach文:foreach ($person as $key => $value)$personに代入された配列(例:['name' => 'Alice', 'age' => 25])の中から、さらにキーと値を取り出して処理します。これにより、'name'と'Alice'、'age'と25といった具体的な情報を表示できます。
実行すると、以下の結果が表示されます。
このように、foreach文をネストすることで、多次元配列の中にあるすべてのデータにアクセスし、それぞれに対して処理を実行することができます。
04.php1<?php 2// 多次元配列をforeachでループする 3$multiArray = [ 4 ['name' => 'Alice', 'age' => 25], 5 ['name' => 'Bob', 'age' => 22], 6 ['name' => 'Charlie', 'age' => 30] 7]; 8foreach ($multiArray as $person) { 9 foreach ($person as $key => $value) { 10 echo "{$key}: {$value}\n"; 11 } 12} 13
php/chapter09/05.php
このコードは、foreach文の途中で特定の条件を満たした場合に、その回の処理をスキップして次の要素の処理に移るcontinueキーワードの使い方を示しています。
$itemsという配列には、'a'から'e'までの文字列が格納されています。
foreach ($items as $item)で、配列の要素を一つずつ$itemに取り出して処理します。
ループの中で、if ($item == 'c')という条件文があります。
- もし
$itemの値が'c'と等しい場合、continue;が実行されます。 continue;が実行されると、その時点での{}内の残りの処理(この場合はecho $item . "\n";)はスキップされ、foreach文は次の要素(この場合は'd')の処理へと移ります。'c'以外の要素については、if文の条件が偽となり、continue;は実行されずにecho $item . "\n";が実行されます。
実行すると、以下の結果が表示されます。
ご覧の通り、'c'だけが表示されずにスキップされています。continueは、特定の条件に合致する要素だけを処理から除外したい場合に有効な制御構造です。
05.php1<?php 2// foreach文の中でのcontinueの使用 3$items = ['a', 'b', 'c', 'd', 'e']; 4foreach ($items as $item) { 5 if ($item == 'c') { 6 continue; // 'c'をスキップ 7 } 8 echo $item . "\n"; 9} 10
php/chapter09/06.php
このコードは、foreach文の途中で特定の条件を満たした場合に、ループ自体を完全に終了させるbreakキーワードの使い方を示しています。
$animalsという配列には、いくつかの動物の名前が格納されています。
foreach ($animals as $animal)で、配列の要素を一つずつ$animalに取り出して処理します。
ループの中で、if ($animal == 'fish')という条件文があります。
- もし
$animalの値が'fish'と等しい場合、break;が実行されます。 break;が実行されると、その瞬間にforeachループ全体が終了し、ループの次の行へと処理が移ります。'fish'に到達するまでの要素('cat'、'dog'、'bird')については、if文の条件が偽となり、break;は実行されずにecho $animal . "\n";が実行されます。
実行すると、以下の結果が表示されます。
'fish'が検出された時点でループが終了しているため、'fish'自身も、その後の'rabbit'も表示されていません。breakは、目的の要素が見つかった場合や、特定の条件を満たした時点でそれ以上ループを続ける必要がない場合に利用されます。
06.php1<?php 2// foreach文の中でのbreakの使用 3$animals = ['cat', 'dog', 'bird', 'fish', 'rabbit']; 4foreach ($animals as $animal) { 5 if ($animal == 'fish') { 6 break; // 'fish'でループを終了 7 } 8 echo $animal . "\n"; 9} 10
php/chapter09/07.php
このコードは、foreach文を使って配列の要素を直接変更する方法を示しています。通常、foreach文で取り出した要素は、元の配列のコピーとして扱われるため、$valueなどの変数を変更しても元の配列は変わりません。しかし、「参照渡し」を使うことで、元の配列の要素を直接変更できます。
まず、$numbersという配列に1から5までの数値が格納されています。
最初のforeach文に注目してください。
foreach ($numbers as &$number)
ここで、$numberの前に&(アンパサンド)が付いています。これは「参照渡し」を意味します。
参照渡しとは、変数の「値」をコピーして渡すのではなく、変数が保存されている「メモリ上の場所(アドレス)」を直接共有することです。これにより、foreachループ内で$number変数の値を変更すると、それは直接$numbers配列の元の要素に反映されます。
$number *= 2;という処理によって、配列の各要素が2倍に更新されます。
unset($number);の重要性:
foreach文で参照渡しを使った後には、unset($number);を実行して参照を解除することが強く推奨されます。もし解除しないと、ループで最後に参照された要素への参照が$number変数に残ったままになり、その後に同じ変数名$numberを別の目的で使った際に、意図せず元の配列の要素に影響を与えてしまう可能性があります。これは予期せぬバグの原因となるため、注意が必要です。
二番目のforeach文は、変更された$numbers配列の中身を確認するために使われています。
実行すると、以下の結果が表示されます。
このように、&を使った参照渡しにより、foreach文の中で配列の要素を直接更新することが可能になります。
07.php1<?php 2// 配列の要素を参照で変更する 3$numbers = [1, 2, 3, 4, 5]; 4foreach ($numbers as &$number) { // &を使って参照渡しを行う 5 $number *= 2; // 各要素を2倍にする 6} 7unset($number); // 参照を開放して予期しないバグを防ぐ 8 9foreach ($numbers as $number) { 10 echo $number . "\n"; 11} 12
php/chapter09/08.php
このコードは、foreach文の中でif文(条件分岐)を組み合わせて使うことで、配列の中から特定の条件を満たす要素だけを選んで処理する方法を示しています。
$valuesという配列には、いくつかの数値が格納されています。
foreach ($values as $value)で、配列の要素を一つずつ$valueに取り出して処理します。
ループの内部では、if ($value > 30)という条件文が書かれています。
- この
if文は、「もし現在の$valueが30より大きければ」という条件をチェックします。 - 条件が真(True)の場合、つまり
$valueが30より大きい場合にのみ、echo $value . "は30より大きい\n";という行が実行されます。 - 条件が偽(False)の場合、つまり
$valueが30以下の場合には、if文の中の処理はスキップされ、次の配列要素の処理へと移ります。
実行すると、以下の結果が表示されます。
このように、foreachとifを組み合わせることで、配列の要素すべてに対して同じ処理を行うのではなく、「特定の条件に合う要素だけ」を効率的に選び出して処理することができます。これは、データのフィルタリングなど、さまざまな場面で活用される基本的なテクニックです。
08.php1<?php 2// 配列の中で条件を満たす要素だけ処理する 3$values = [10, 20, 30, 40, 50]; 4foreach ($values as $value) { 5 if ($value > 30) { 6 echo $value . "は30より大きい\n"; 7 } 8} 9
php/chapter09/09.php
このコードは、foreach文を使って配列の各要素(文字列)を順に取り出し、それぞれの文字列をすべて大文字に変換して表示する練習問題の例です。PHPの組み込み関数strtoupper()を利用しています。
$wordsという配列には、3つの小文字の英単語が格納されています。
foreach ($words as $word)で、配列の要素を一つずつ$wordという変数に取り出して処理します。
ループの内部では、echo strtoupper($word) . "\n";という処理が実行されています。
strtoupper()はPHPの文字列関数の一つで、引数に渡された文字列をすべて大文字に変換して返します。- 例えば、
strtoupper('apple')を実行すると'APPLE'という文字列が返されます。 - その結果を
echoで画面に表示し、\nで改行しています。
実行すると、以下の結果が表示されます。
この例のように、foreach文と文字列操作関数を組み合わせることで、配列内の複数の文字列に対して一括で変換処理を行うことができます。これは、Webアプリケーションでユーザーからの入力を整形する際など、実用的な場面でよく使われる手法です。
09.php1<?php 2// 配列に含まれる文字列をすべて大文字に変換して表示する練習問題 3$words = ['apple', 'banana', 'cherry']; 4 5foreach ($words as $word) { 6 echo strtoupper($word) . "\n"; 7} 8
おわりに
本記事では、PHP開発の土台となる基本的な開発環境の準備から解説を始めました。配列の繰り返し処理に不可欠なforeach文について、値だけを取り出す方法と、キーと値の両方を取り出す基本的な使い方を学びました。さらに、連想配列や多次元配列の処理、continueやbreakによるループ制御、そして参照渡しによる配列要素の直接変更といった、実践的なテクニックも習得しました。これらのforeach文の知識は、システム開発におけるデータの効率的な処理に欠かせないため、今後の学習や実務で積極的に活用してください。