PHPでのfor文の基本的な書き方から、HTMLに埋め込んでもキレイにスッキリ書く方法などもご紹介します。
HTMLの中に通常のfor文のコードを埋め込むとソースが汚くなり、閉じ忘れや閉じ過ぎなどのネスト地獄に陥り、思わぬミスを誘発します。
この書き方で、ネストエラーを防ぎましょう。
目次
for文の基本
for文の使い方
1 2 3 |
for ($i=1; $i<5; $i++) { echo $i; } |
1234
for文の構文
for文は以下のように記述します。
for (初期値; 繰り返しの条件式; 増減式) {
繰り返す処理
}
for文の動作
以下の例は「オラ」を4回繰り返しています。
1 2 3 |
for ($i=1; $i<5; $i++) { echo 'オラ'; } |
オラオラオラオラ
上記の例だと、以下のように進みます。
- まず変数
$i
に数字の1を格納する。 - 次に変数
$i
が5未満の場合、処理を続けなさいと命じる。 - そして
$i++
で変数$i
に+1ずつ数字を足していくので$i
は1ずつ増えていく。 - それから「オラ」と表示させる。
- そしてまた式の最初に戻り、
$i
は2なので、処理を続行。 - そして
$i
に1を足す。 - まだ
$i
は5に満たないので処理を続け、「オラ」と追加で表示させる。
………
……
…と繰り返していくと$i
が5になり、$i<5
の条件に合わなくなるため、処理を終了します。
参考:PHPの変数でムダを省き、効率良くコーディングする方法
for文を使わない場合
では上記のコードでfor文を使わずに書く場合はどうなるか?
以下のようになりますね。
1 2 3 4 |
echo 'オラ'; echo 'オラ'; echo 'オラ'; echo 'オラ'; |
少ない処理だと上記のように書いてもいいですが、例えば0歳~80歳まで1歳刻みのプルダウンメニューを作るとなるとどうでしょう?
option
タグを81個も作らないといけませんね。
「オラ」を1,000回表示させたい場合だとどうでしょう?
for文のような繰り返し処理の関数がないと、気が遠くなる作業ですね。
ループ処理中に特定の値をスキップする
ループ処理中に配列の中で不要な値はスキップしたい時に便利なのがcontinue
文です。
if文でスキップしたい値を指定して、該当する値のみ条件分岐でcontinueさせます。
詳しくは以下ページでご紹介しています。
特定の値でループ処理を終了させる
ループ処理中に配列の中の特定な値が出てきたら、その時点で処理を終了させる時にはbreak
が便利です。
if文で処理を終了させたい値を指定して、該当する値以降はbreak
により出力されません。
詳しくは以下ページでご紹介しています。
「endfor」でHTMLに埋め込んでもキレイなソースが書ける
上記に紹介した書き方が一般的ですが、HTMLに埋め込んで書くとコードがゴチャゴチャとなり、思わぬ構文エラーを引き起こしがちです。
HTMLに通常のfor文を書いた場合
0~80歳のプルダウンメニューをfor文で作成します。
1 2 3 4 5 6 7 8 9 10 11 |
<h2>年齢を選択</h2> <select name="age"> <?php for ($i=0; $i<=80; $i++) { ?> <option value="<?php echo $i ?>"><?php echo $i.'歳' ?></option> <?php } ?> </select> |
HTMLにスッキリなfor文を書いた場合
上記はまだシンプルな方ですが、もっと複雑なコードになると最後の波カッコとかよく忘れて、構文エラーになります。
以下のようにスッキリ書くこともできます。
1 2 3 4 5 6 7 8 9 10 11 |
<h2>年齢を選択</h2> <select name="age"> <?php for ($i=0; $i<=80; $i++) : ?> <option value="<?php echo $i ?>"><?php echo $i.'歳' ?></option> <?php endfor; ?> </select> |
上記のように{
(波カッコ)を:
(コロン)に、}
(波カッコ閉じ)はendfor
に差し替えて書くこともできます。
if文もそうですが、HTMLに埋め込みながらPHPのコードを書く時は上記の方が見やすいなと私は思います。
参考:PHPでif文(HTML埋め込みでもスッキリな書き方も)
他の方が書いたコードで見かけることも多いと思いますので、知っておくと良いでしょう。
条件式の処理の簡略化
配列をfor文でループ処理する際、for文の条件式でcount
すると処理が重くなるので避けたいですね。
for文の条件式でcountする場合
1 2 3 4 5 6 7 |
// 変数に配列を格納 $citys = array('神奈川','大阪','福岡'); // for文の条件式で配列を毎回countしながらループ処理 for ($i=0; count($citys) > $i ; $i++) { echo $citys[$i]; } |
毎回、数をカウントしながらループ処理をします。
for文の外であらかじめcountしておく場合
1 2 3 4 5 6 7 8 9 10 |
// 変数に配列を格納 $citys = array('神奈川','大阪','福岡'); // 配列をカウントし、その数を変数に格納 $cnt = count($citys); // for文の条件式にはカウントした数を設定 for ($i=0; $i < $cnt ; $i++) { echo $citys[$i]; } |
あらかじめ配列の数をカウントし、そのあとでfor文でループ処理をしています。
参考:PHPで配列の要素数(長さ)をカウント(count関数)
上記2パターンを比べると、以下の違いがありますね。
- for文の中で毎回配列をカウントしながらループ処理
- for文の前にあらかじめ配列の数をカウントしておく
1.はループのたびに毎回、数をカウントする処理が入るので、その分処理が重くなります。
体感速度的には変わらないでしょうが、ムダな処理はなるべくさせないようコーディングすることも意識したいですね。