プログラミングの配列処理は初心者には敷居が高いですね。私も苦労した覚えがあります。
ただPHPで配列を処理する場面は多く、必須のスキルとなるため頑張って覚えていただきたいと思います。
foreach()
を使った配列処理を初心者の方にも理解できるよう、できるだけ分かりやすくお伝えします。
目次
foreachの基本的な構文
添字配列をforeachする書き方
1 2 3 4 5 |
$cities = array ('横浜','大阪','福岡'); foreach ($cities as $city) { echo $city.'市 '; } |
横浜市 大阪市 福岡市
添字配列のforeachの構文
foreach (配列変数 as 配列変数から取り出した値を格納する変数) {
繰り返す処理;
}
参考:PHPの変数でムダを省き、効率良くコーディングする方法
添字配列をforeachしたときの処理
以下の例では、変数$cities
に格納された3つの都市を、foreach()
で一つずつ取り出し、変数$city
にコピーしたものを表示させています。
1 2 3 4 5 |
$cities = array ('横浜','大阪','福岡'); foreach ($cities as $city) { echo $city.'市 '; } |
横浜市 大阪市 福岡市
上記の例だと、以下のように処理されます。
- 配列が格納された変数
$cities
をforeach()
の左側にセット foreach()
の右側には、一つずつ取り出した時の変数$city
を宣言
※foreach()
の右側の変数はなんでも良いが、複数形の配列変数に対し、単数形の変数名にすることが多いです。
例)$prefs as $pref、$songs as $song、$foods as $foodなど(「$value」などもよく使われます。)foreach()
の左側と右側にセットした変数の間にas
と書く- 配列
$cities
で配列の最初にある値(ここでは横浜)がコピーされ、変数$city
に格納される echo $city
で出力される
(.'市'
を付け足し、◯◯市となるようにしています。)- 配列にはまだ2つの値が残っているので、また最初に戻り繰り返す
- 配列
$cities
に残された大阪
が次にコピーされ、変数$city
に上書きコピーされる 横浜
の次に出力される- 配列にはもう1つの値が残されているので、最初に戻り繰り返す
- 配列
$cities
に残された最後の都市福岡
が取り出され、変数$city
に上書きコピーされる 大阪
の次に出力される- 配列は全部処理したので、自動的に繰り返処理を終了してくれる
foreach()
が便利なのは、for()
やwhile()
と違って、対象が空になったら自動的に処理を終了してくれるところです。
参考:PHPのfor文で繰り返し処理(HTML埋め込みでもスッキリな書き方も)
連想配列の処理
foreach()
は連想配列も処理できます。
キーと値をそれぞれ処理できるため、より複雑な処理が可能です。
連想配列でのforeachの書き方
1 2 3 4 5 6 7 8 |
$prefs = array ( 1 => '東京都', 2 => '大阪府', 3 => '愛知県' ); foreach ($prefs as $key => $val) { echo'・'.$key.$val; } |
・1東京都・2大阪府・3愛知県
連想配列でのforeachの構文
foreach (配列変数 as キーを格納する変数 => 値を格納する変数) {
繰り返す処理;
}
連想配列でのforeachの処理
以下の例では、変数$prefs
に連想配列で格納された3つの都府県をforeach()
で取り出し、キーは変数$key
に、値は変数$val
にそれぞれ格納し、$key
と$val
を1セットにして、1セットずつ出力しています。
1 2 3 4 5 6 7 8 9 |
$prefs = array ( 1 => '東京都', 2 => '大阪府', 3 => '愛知県' ); foreach ($prefs as $key => $val) { echo '・'.$key.$val; } |
・1東京都 ・2大阪府 ・3愛知県
ループ処理中に特定の値をスキップする
ループ処理中に配列の中で不要な値はスキップしたい時に便利なのがcontinue
文です。
if文でスキップしたい値を指定して、該当する値のみ条件分岐でcontinueさせます。
詳しくは以下ページでご紹介しています。
特定の値でループ処理を終了させる
ループ処理中に配列の中の特定な値が出てきたら、その時点で処理を終了させる時にはbreak
文が便利です。
if文で処理を終了させたい値を指定して、該当する値以降はbreakにより出力されません。
詳しくは以下ページでご紹介しています。
配列のNULLチェックでエラーを回避
foreach()
で下記のようなエラーが出てハマったことがありますが、みなさんも経験ありませんか?
Warning: Invalid argument supplied for foreach() in…
これは配列がnull
、つまり配列が無いためループ処理ができないというエラーです。
以下の2つの方法でエラーを回避しましょう。
配列キャストによるエラー回避
1 2 3 4 5 6 |
$cities = NULL; // (array)でキャストする foreach ((array)$cities as $city) { echo $city; } |
foreach()
の最初に、配列にキャスト(型変換)する(array)
を入れており、エラーは出ません。
null
だとエラーになる(array)
で配列にキャストし、空の配列にする- 空の配列は
null
ではないためエラーにはならない
ただ、この方法では、何も出力されないため画面は真っ白のままです。
ユーザーには何が起きたか理解できないでしょう。
思わぬ例外をとりあえず回避するには使えるかもしれませんね。
条件分岐でエラーメッセージを出す
1 2 3 4 5 6 7 8 9 10 11 12 |
// is_array関数で配列かどうか判定する if(is_array($cities)) { // 配列だったらforeach関数でループ処理 foreach ($cities as $city) { echo $city; } // 配列じゃなかったらエラーメッセージを表示 } else { echo 'ありません。'; } |
is_array()
で配列かどうかをはんていできるので、if文で条件分岐させています。
is_array()
で変数$cities
が配列かif文で条件分岐- 配列だったら
foreach()
でループ処理 - 配列じゃなかったらエラーメッセージを表示
ユーザーが空の条件を指定しそうなケースだったら、この方法が親切でしょう。
PHPのエラーを本番環境で表示させるのは避けたいですし、HTML表示が崩れる場合もあるので、適切なエラー処理を行いましょう。
endforeachの書き方でHTML埋め込みもスッキリ!
連想配列のforeach()
は都道府県などのプルダウンメニュー作成に便利ですね。
HTMLに埋め込んで書くことを想定して、endforeach
を使った別の書き方でスッキリしたコードに仕上げました。
}
(波カッコ)の閉じ忘れやネストエラーを防ぐこともできますし、可読性に優れるため、オススメです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php $prefs = array ( 1 => '東京都', 2 => '大阪府', 3 => '愛知県' ); ?> <select name="pref"> // {(波カッコ)の代わりに、:(コロン)を使う <?php foreach ($prefs as $key => $val) : ?> <option value="<?php echo $key; ?>"><?php echo $val; ?></option> // 最後は endforeach と;(セミコロン)で閉じる <?php endforeach; ?> </select> |
{ }
(波カッコ)を使わない代わりに、:
(コロン)を付け、一番最後にendforeach
を付けます。
endforeach
以外は;
(セミコロン)は不要です。
HTMLに埋め込むとソースが汚くなりがちですが、これでだいぶスッキリと書くことができますね。
参考:PHPでif文(HTML埋め込みでもスッキリな書き方も)