• トップ
  • ブログ一覧
  • 【PHP】配列を繰り返し処理をするforeachの使い方と落とし穴
  • 【PHP】配列を繰り返し処理をするforeachの使い方と落とし穴

    メディアチームメディアチーム
    2019.03.11

    エンジニアになろう!

    PHPの特殊な構文foreachをマスターしよう!

    にゃんこ先生 にゃんこ師匠
    バカとブスこそプログラマーになれ!でおなじみのプログミング教室はじまるぞ~い!
    見習いPG見習いPG
    ドラゴン桜にでもハマってるんですか(笑)全然お馴染みじゃないし、読者離れが進みそうなのでやめて下さい
    にゃんこ師匠 にゃんこ師匠
    今日のお題は、PHPのforeach文についてお勉強するニャン!
    見習いPG見習いPG
    急にかわいくなっても手遅れです

    配列を学習する上で、必ずと言っていいぐらい出てくるのがforeach

    配列にデータを入れた後は、foreachをどう扱って処理するかが重要になります。

    基本的に、foreach文は「配列の中身を順番に取り出してくれる」ときに使います。

    初心者の方には、foreach文のような繰り返し処理は、なかなかイメージしづらいと思います。

    ですが、よく理解せずになんとなく使っていると、ひょんなことから落とし穴にハマってしまうので注意が必要です。

    見習いPG見習いPG
    foreach文は、「配列の中身を順番に取り出してくれる」のですね。
    にゃんこ師匠 にゃんこ師匠
    さらに、データを加工したり、表示したりと柔軟な使い方もできるのじゃ

    なんだか取っつきにくいforeach文

    foreach文は、配列の中身を繰り返し処理してくれることは、なんとなく理解できるはず。

    でも、なんだか取っつきにくい…。

    foreach文の書き方としては、主に2つあります。

    その1

    1<?php
    2foreach($array AS $value){
    3~処理1.配列$arrayの中身を1つ取り出して$valueに代入する~
    4~処理2.配列$arrayの次の中身があれば処理1に戻り、なければ処理を終了する~
    5}
    見習いPG見習いPG
    こちらは、配列($array)の中身($value)を順番に取り出すことを繰り返します。
    にゃんこ先生 にゃんこ師匠
    配列の中身を順番に取り出すだけじゃ

    その2

    1<?php
    2foreach($array AS $index => $value){
    3~処理1.配列$arrayの中身を1つ取り出して$valueに代入する~
    4~処理2.配列$arrayの次の中身があれば処理1に戻り、なければ処理を終了する~
    5}
    6?>
    見習いPG見習いPG
    こっち、配列($array)の番号($index)と中身($value)を順番に取り出すことを繰り返します。
    にゃんこ師匠 にゃんこ師匠
    番号も一緒に取れるんじゃ!

    どちらも基本的に動作は同じですが、2つ目の書き方は0から順番に付与される番号(インデックス番号)を合わせて取得することが可能です。

    初心者の方には、この2つの書き方をどう使い分けていいのかが非常にイメージが湧きにく井と思います。

    特にいきなり登場してきたインデックス番号は、理解が不足している時点では余計に混乱を招き、どう使えばよいのかという疑問が残るかと思います。

    実際にforeach文を書いてみる!

    では、実際にはどのように活用していけばよいのでしょうか?

    例えば、以下のように配列の中に日本の主要都市の名前を代入してみます。

    1<?php $city = array('北海道', '東京', '愛知', '大阪', '福岡'); ?>

    そしてこの都市名をforeach文を使って順番に表示します。

    1<?php
    2foreach($city AS $index => $value){
    3print $value . 'は' . $index . '番です。';
    4}
    5?>

    結果は以下のように表示されます。

    北海道は0番です。
    東京は1番です。
    愛知は2番です。
    大阪は3番です。
    福岡は4番です。

    この結果だけを見ても、あまりピンとこないかもしれません。

    でも、例えば、申し込みサイトなどで見かける住所入力画面では、47都道府県が表示されているケースがあります。

    都道府県の情報がデーターベースで管理されている場合は、こういった順で処理されて表示されているケースが多くあります。

    1.都道府県名が保存されたデータベースから都道府県名を取得する
    2.データベースから取得したデータを配列に入れる
    3.入力フォームの住所欄に都道府県名を表示する

    これなら都道府県にとどまらず、市区町村といったより多くのデータを扱うようになっても容易に対応できます。

    また、選択する都道府県にラジオボタンをつけて、選択する画面でラジオボタンの値をインデックス番号に設定しておくことで、例えば3番をチェックしたときは、住所は内部的に”大阪”として扱うことで後続の処理につなげていくこともできます。

    画面に表示する名前は$valueを出力して、実際に扱うデータは$indexを使用するといった使い方もできます。

    勝手に繰り返して処理をしてくれる

    なにより最大の利点は、配列の数だけ”勝手に繰り返し処理してくれる”という点です。

    通常であれば、ただ繰り返して処理したい場合、実際に処理を何回繰り返すのかといった数を指定しなければなりません。

    ですがforeach文の場合は、配列に入っている値を取り出して、それを最後まで取りだすことを繰り返すので、わざわざ繰り返し回数を指定する必要はありません。

    また、配列に入っている指定の値だけを取得したい場合は、取り出した時点で繰り返し処理を終了することも可能なので、そのあとの不要な処理を実行せずに済みます。

    便利なforeachに潜む落とし穴に要注意

    このように配列を扱うのに便利なforeach文ですが、扱いに十分注意しなければ大きな落とし穴にはまってしまいます。

    それは、配列の中身が1つも存在しないままforeach文が実行されるとエラーになってしまい、処理が異常終了してしまいます。

    もちろん学習や開発途中の話であれば、配列の中身に値を代入してもう一度実行すれば問題ありません。

    しかし、それが商用稼働しているシステムで起こってしまい、サービスが中断されてしまってはユーザーに多大な迷惑がかかってしまうことになります。

    見習いPG見習いPG
    これは怖いですね・・・
    にゃんこ師匠 にゃんこ師匠
    そうなんじゃ・・・!十分気を付けるんじゃぞ!

    配列が正常にセットされているかが重要

    このようなforeach文でのエラーを防ぐためには、あらかじめ対象の変数の中に配列が正常にセットされているのか確認することが重要になります。

    foreach文が実行される前に、配列に値がセットされているのかを確かめる処理を入れておくことで、配列に値がない場合は実行されず、エラーの発生を免れることができます。

    取り扱いにちょっとした工夫が必要なforeach文ですが、使い方をマスターすれば大変便利と言えるでしょう。

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    メディアチーム
    メディアチーム
    Show more...

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background