【PHP】foreach文 – 配列の値を1つずつ取り出す繰り返し処理

配列から値を1つずつ取り出すにはforeach文と呼ばれる繰り返し処理を使うと便利です。

ここではforeach文について解説します。

★ 内容

  • foreach文
  • for文とforeach文の比較

foreach文とは

foreach文は繰り返し処理を行うための仕組みで、配列から値を1つずつ取り出し、繰り返し処理を実行します。

繰り返し処理にはfor文を使う方法もありますが、異なる点は『配列と合わせて使用すること』と『配列の値の数だけ繰り返し処理を行うこと』です。

foreach文で実装できるプログラムはfor文でも実装できますが、foreach文を使うことで、コードの可読性向上やバグの原因を抑えて実装することができます。

基本構文

foreach文の基本構文は次のようになります。

foreach( 配列 as 変数 ) {
    // 処理1
    // 処理2
    // ・・・・・・・・
}

処理の順序

foreach文の処理の順序は次のようになります。

  1. 配列の先頭から値を1つ取り出す
  2. 取り出す値がない場合、終了する
  3. 取り出した値を変数に記憶する(asの後ろの変数)
  4. ブロックの処理を実行する
  5. 1に戻る

サンプルコード

foreach文を使ったサンプルコードをご覧ください。

ソースコード

<?php

$fruits = [
    'Apple',
    'Orange',
    'Grape',
    'Melon',
];

foreach( $fruits as $data ) {
    echo $data."\n";
}

?>

実行結果

Apple
Orange
Grape
Melon

foreach文の繰り返しごとに$fruitsから値を1つずつ取り出し、asに続く$dataに記憶しています。
実行結果からも値が1つずつ取り出せていることが分かります。

foreach文とfor文の比較

foreach文ができることは、for文でもできますが、配列から値を取り出す繰り返し処理の場合は、foreach文の方がコードの可読性とバグの原因を抑える面で優れています。

比較するため、上記サンプルコードのfor文バージョンをご覧ください。

for文の場合

ソースコード

<?php

$fruits = [
    'Apple',
    'Orange',
    'Grape',
    'Melon',
];

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

?>

実行結果

Apple
Orange
Grape
Melon

変わった部分は10行目と11行目になります。
先ず記述量が増えたことでコードが読みづらくなったことが分かります。

また、count($fruits)$fruitsに記憶された値の数を取得する記述で、それを使って繰り返し回数の条件式を記述しています。

この条件式を間違えてしまうとエラーが発生する原因になります。
例えば、条件式を誤って$i <= count($fruits)とした場合を見てみましょう。

ソースコード

<?php

$fruits = [
    'Apple',
    'Orange',
    'Grape',
    'Melon',
];

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

?>

実行結果

PHP Warning:  Undefined array key 4 in sample.php on line 11

Warning: Undefined array key 4 in sample.php on line 11

条件式により$iが0〜4の間は繰り返し処理しますが、4はキーに存在しないため、エラーになります。

foreach文であれば配列の値の数に合わせて繰り返し処理を行うので、こういったバグの原因を防ぐことができます。

演習問題

問題1

解答例

次の実行結果になるプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 配列型の変数$price_listを使用する
  • $price_list100027005800を記憶する
  • $price_listの値の合計値をforeach文を使って計算する
  • 合計値は$totalに記憶する
  • $totalを出力する

実行結果

9500

問題2

解答例

コマンドライン引数で与えた数値(複数)の合計値を計算するプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 合計値はforeach文を使って計算する
  • 合計値は$totalに記憶する
  • $totalを出力する

実行例1

コマンドライン

php practice.php 5 14 28 71

実行結果

total : 118

実行例2

コマンドライン

php practice.php 11 22 33 44 55 66 77 88 99

実行結果

total : 495

まとめ

foreach文は配列の値を1つずつ取り出しながら、繰り返し処理を行う仕組みです。
for文との違いを理解し、使い分けすることでプログラムを正確に早く作れるようになるので、覚えていきましょう。