PHP基本編

繰り返し処理

1. 準備

 これまでと同じくサンプル用のhtmlとphpファイルを作成します。[Xamppフォルダ]→[htdocsフォルダ]→[pkpkisoフォルダ]で、ひな形ファイル「hina.html」を[Ctrl]+[c]し、[Ctrl]+[v]を2回すると2つコピーができますので、それぞれの名前を「kihon06.html」と「kihon06.php」に変更。それぞれ以下のように編集します(ここで時間をかけても仕方ないのでコピペでOK)。

  kihon06.html
  

  kihon06.php
  

 念のため内容を確認すると、まずkihon06.htmlでは<form>タグでkihon06.phpにデータを送る設定をし、そのデータ入力部品として<input type="text">と送信ボタン<input type="submit">、リセットボタン<input type="reset">を設置してます。一方、kihon06.phpでは、$_POST(postメソッド)でデータを受け取り、変数$dataに代入しています。データ送受信の対応を確認しましょう。その上で「$data」の内容を1回だけ表示しています。

SPONSORED LINK

 作成したらXamppを起動しlocalhost経由で表示します。「http://localhost/phpkiso/kihon06.html」です。Xamppって何?な人はPHP開発環境準備編・Xamppの起動Xamppの設定を要チェック。うまくいけばkihon06.htmlで入力されたデータが、kihon06.phpに受け渡されて表示されます。

    

2. 繰り返し処理

 さて繰り返し処理の説明に入りましょう。HTMLとは異なり、PHPのようなプログラミング言語に広く備わった強力な機能に「繰り返し処理」があります。人間には、同じことを全く同じように繰り返すことは難しいですが、コンピュータは、高速に、間違いなく、疲れることもなく繰り返すことができます。
 PHPの繰り返し処理には「for命令」「while命令」「do~while命令」「foreach命令」を使ったものがあります。ですがここでは「for命令」に絞って見ていきましょう。繰り返すので「forループ」と言ったりもしますが同じものです。「while」とか「do~while」もありますが、実は「for命令」だけ知っていれば、他の命令を知らなくても事足りてしまいます。この資料は「超入門」ですので、いろいろ手を広げるよりもまずは「for命令」をマスターしましょう。でも「foreach命令」だけはちょっと便利な機能があるので次のページで取り上げます。他は参考情報をこのページの最後のところに載せておきますので詳しくは調べて下さい。
 というわけで「for命令」。書き方は次のような構造になっています。

  for文の構造
  

 意味としては「for()に指定された、繰り返しカウント数が指定範囲内なら{ }内の処理を実行してカウントを進め、また繰り返しカウント数が指定範囲内なら{ }内の処理を実行してカウントを進め・・・・・・繰り返しカウント数が指定範囲を超えたら終了」ということになります。
 よく見て構造を確認して下さい。構造的には条件分岐の「if(条件){~}」に似てますよね。意味は違いますが形は似てます。書き方も「if(条件){~}」と同様に一行で書くこともできますが、やはり「if(条件){~}」と同様に見にくくなってしまうので、構造を把握しやすいように、改行やインデント(字下げ)を使って書くことが普通です。
 それでは具体的に確認しましょう。kihon06.phpを次のサンプルのように編集します。

  kihon06.php(php部分以外は省略)
  

 解説します。まず最初の2行はOK。修正したのはその次の「for文」以降です。
 早速の「for文」ですが、この「for()」の中では、上で確認した通り「開始カウント数」「繰り返しカウント範囲」「回数カウント処理」を指定しています。
 1つ目「開始カウント数」は、ここでは「$i=0」となっています。変数「$i」に数字の「0」を代入しているわけです。この数字は、繰り返しの回数を管理するための「最初の番号」で、「10」でも「25」でも「321」でもなんでもかまいません。ただ「最初の番号」ですから中途半端な数はわかりにくいですし、一般的には「0」(ゼロ)とすることが多いので、ここでも「0」(ゼロ)としています。一方の変数「$i」ですが、これも「$kaisu」でも「$number」でも任意に指定できますが、for文ではよく「$i」を使いますのでここでもそれに倣っています。「$j」(ジェイ)も「$i」とセットで使われます。それからこの設定の後に「;」(セミコロン)がありますので忘れずに。
 2つ目「繰り返しカウント範囲」の箇所には「$i<3」と指定されています。これは「変数$iが3より小さい間は{ }の中の処理を繰り返しなさい」という意味になります。つまり、最初の番号は「0」でしたので「$iが0から始まって3にならない間は繰り返す」ということです。ここでは範囲指定に「<」を使いましたが、他の比較演算子も使えます「<=」(以下)とか「>」(より大)など数値の大小を判断する演算子がよく使われます。比較演算子についてはPHP基本編・論理比較演算にも情報があります。そしてここでも「;」(セミコロン)を忘れないようにしましょう。

SPONSORED LINK

 3つ目「回数カウント処理」です。ここでは「$i++」が設定してあります。この書き方、わかりますか?PHP基本編・データ渡しと変数にも書きましたが「$i=$i+1」を短縮した書き方です。実際ここで「$i=$i+1」と書いてもOKですが「for()」の中ではよく短縮形が使われるのでここでもそうしました。いずれにせよこの「$i++」の意味は、変数「$i」の値に「1」を足した結果を、変数「$i」に再び代入する、ということです。もし「$i」の中に「0」(ゼロ)が入っていたとすると、「$i++」を実行した後は「$i」の中身は「1」になります。その後にもう一度「$i++」を実行すると「$i」には「2」が設定されることになります。
 次に「for()」に続く「{ }」を見ましょう。ここでは「for()」で指定された回数分繰り返す処理の内容を設定しています。「echo $data;」と書かれていますので、$dataの内容を表示せよ、ということですね。
 というわけで、ここでの「forループ」全体の意味は、「$i=0から始まり、$iを1ずつ増やして、$i<3の間、echo命令での表示を繰り返しなさい」という意味になります。つまりは「$dataの中身を3回繰り返して表示する」ということです。
 それではもしデータを100個表示したい場合、どこを直せばいいかわかりますか?そうです。上記スクリプトの「$i<3」という箇所を「$i<100」にすればOKです。1000個の場合も同じ。何回でも繰り返し処理を増やせます。とはいえ、むやみに増やしすぎもダメです。処理しきれないとコンピュータが止まりますのでやめましょう。
 なお、このサンプルの「3回繰り返す」という設定方法は、別のやり方もあります。用途や好みに合わせていくつかのやり方を選べるわけです。というわけで、もしかすると使うかもしれない設定方法についてすぐ下の節にまとめておきますので後で確認して下さい。
 サンプルができたら動作させてみましょう。localhost経由でまずは「kihon06.html」にアクセスして適当にデータを入れて「送信」してみましょう。「kihon06.php」ページで入力したデータが3回表示されましたか?うまくいかない場合はよく確かめて下さい。

  

3. for文の繰り返し設定のバリエーション

 上記のサンプルでは、forループを3回繰り返す方法を確かめましたが、「3回繰り返す設定」にはいろいろなやり方があります。というわけで、回数指定の方法の例をいくつかまとめて紹介しておきます。
  ●0から始め1ずつ増やして3より小さい間、3回繰り返す設定(基本)
  
  (上記サンプルと同じ3回繰り返す基本の設定方法。$iは0→1→2と変化)

  ●1から始め1ずつ増やして3以下の間、3回繰り返す設定
  
  ($iを1から始めているため繰り返す条件を「<=」と設定。$iは1→2→3と変化。処理で1以上の番号を使う場合など)

  ●0から始め2ずつ増やして6より小さい間、3回繰り返す設定
  
  ($iを0から2ずつ増やし「$i<6」の間繰り返す設定。$iは0→2→4と変化。処理で偶数の数値を使う必要がある場合など)

  ●3から始め1ずつ減らして0より大きい間、3回繰り返す設定
  
  ($iを3から1ずつ減らし「$i>0」の間繰り返す設定。$iは3→2→1と変化。処理でカウントダウンなど逆順の番号を使う必要がある場合など)

 後のサンプルでも確認しますが、繰り返し回数を管理する変数(上記は$i)は、単に繰り返し回数をカウントするだけではなく、画面に表示したり、HTMLタグの属性値として設定したりするためにも使われます。使い方によって繰り返し設定の仕方、カウントの仕方を工夫すると便利なことがあります。覚えておきましょう。

SPONSORED LINK


4. 繰り返しの入れ子

 if文による条件分岐と同様に、繰り返し処理も入れ子にすることができます。つまり「Aを3回繰り返す処理、を5回繰り返す」という処理です。わかりやすく言えば「1日3回ケーキ、を5日間繰り返す(太る)」ということです。かえってわかりにくい気もするので、サンプルで確かめましょう。

  kihon06.php(php部分以外は省略)
  

 forループが2重になっているのがわかりますか?色分けすると次のようになります。

  

 まず3行目の「for()」です。これは2重のforループの外側です。「$j=0」から始まり「$j++」で1ずつ増やして「$j<5」の間、つまり$jが0→1→2→3→4の5回、続く{ }内を繰り返す、という内容です。上記の色分けで言うとオレンジ部分を5回繰り返すわけです。変数は$j(ジェイ)ですので要確認。
 そしてこの外側forループの{ }内。ここには2つ。内側forループとecho命令があります。
 1つ目は内側forループ。5行目からのブルー部分の「for(){~}」です。ここでは「$i=0」からスタートして「$i++」で1ずつ増やしながら「$i<3;」の間、つまり$iが0→1→2の3回、その後の{ }内の「echo $data;」を繰り返すよう指定しています。こっちの変数は$i(アイ)です。この内側forループは、よく見ると一つ前のサンプルのforループと同じものをインデント(字下げ)しただけのものです。
 2つ目はecho命令。サンプル下から3行目の「echo '<br>';」です。改行タグ<br>を出力しているだけですが、この位置関係、わかりますか?内側forループの{ }の外だけど外側forループの{ }中には入っています。つまり3回繰り返す小さなループには入ってないけど、5回繰り返す大きなループには入っているわけですね。内側forループで$dataの出力を3回繰り返した後に、改行タグ<br>を1回出力するということになります。
 そしてこれらの2つの処理「$dataを3回出力して、<br>を1回出力する」という処理を外側forループとして5回繰り返しています。ですので$dataは、3つ表示が5回行われるということで、合計15回出力されることになります。
 編集が済んだら処理を確かめましょう。localhost経由で「kihon06.html」を開いてデータを入力して「送信」します。「kihon06.php」ページに展開し入力データが3回ずつ5段に表示されましたか?うまくいかない場合はどこかに間違いがあるはず。順を追ってよーく確かめて下さい。

  

5. 繰り返しカウント数の利用

 forループ文では、指定された繰り返し回数を実現するために、繰り返し回数をカウントしています。上のサンプルで「$i++」とか「$j++」とか出てきましたよね?そしてこの回数の値は単にカウントするだけじゃなく、表示したり計算したりほかの処理に使ったりすることができます。例えば、次のような番号を出力したい場合です。

  

 「2行目」とか「3太郎」とか番号が表示されていますよね?このような番号はfor文の繰り返し回数を設定する変数を使って出力することができます。どうやって使うか?サンプルで確かめましょう。

  kihon06.php(php部分以外は省略)
  

 まず「for()」の繰り返し設定は一つ前のサンプルと同じ。内側forループが3回、外側forループが5回繰り返すよう設定しています。ここで追加したのは、それぞれの繰り返し内容を指定する{ }内です。
 まずは簡単な内側forループから見ていきましょう。8行目に「echo $i+1;」が追加されています。これはわかりますね?「$i+1」の計算結果を表示しなさいというecho命令です。変数$iは、ここでは内側forループの繰り返し回数を管理する変数で、0→1→2と変化します。そこでこれを使って番号を表示しているわけです。もちろん「$i+1」と1を足されている理由は、番号なので1→2→3としたいからです。その次の行では「echo $data;」が設定されていますので、上記のイメージの通り、改行もなく横並びに「1入力データ2入力データ3入力データ」と表示されるわけです。
 続いて外側forループの{ }内を見ましょう。ここでは5行目に「echo ($j+1).'行目:';」というのがあります。これは「($j+1)」の計算結果と「~行目:」という文字列を結合して表示せよというecho命令です。計算式が「($j+1)」と「()」でくくられていますが、これは計算結果を「.」(ピリオド)で文字列と結合するため、計算式をまとめるために使っています(ないとエラーになります)。詳しくはPHP基本編・データ受渡しと変数を見て下さい。
 他は上で見たサンプルと同じです。内容は理解できましたか?理解できたら動作確認しましょう。localhostサーバー経由でkihon06.htmlにアクセスします。データを入力して送信してみて下さい。上のイメージのようになったらOKです。

SPONSORED LINK


6. 計算式の活用

 ここまでforループの繰り返し回数をカウントする変数を使って番号を表示しましたが、繰り返しにとらわれず、もっと自由に番号を付けたり、活用したりしたいということがあります。例えば、上のサンプルでは、表示する各行を「1太郎2太郎3太郎」「1太郎2太郎3太郎」・・と1、2、3番を繰り返して表示しましたが、「1太郎2太郎3太郎」「4太郎5太郎6太郎」「7太郎8太郎9太郎」・・・と通し番号を付けたい場合もあるはずです。
 この場合でも繰り返し回数の変数「$i」や「$j」を使って、内側forループの{ }内、8行目の「echo $i+1;」の代わりに「echo $j*3+$i+1;」とやれば通し番号を表示できます(なぜそうなるかは考えてみて下さい)。でも、このようなやり方はちょっとややこしい。ということで、表示用の計算式を作ってしまおうという安易な・・・いや賢いやり方を考えましょう。サンプルを次のように編集します。

  kihon06.php(php部分以外は省略)
  

 内容を確認します。まず3行目に「$bango=0;」を追加しました。これは数値のゼロを変数$bangoに代入する、ということですね。問題ないと思います。
 もう一つ追加したのは、内側forループの{ }の中。9行目の「$bango=$bango+1;」です。これは変数$bangoの値に「1」を足してまた変数$bangoに代入している、ということです。これもOKでしょう。なおこれは短縮形で「$bango++;」としても同じ結果になります。
 そして続く10行目。echo命令の内容を修正して変数$bangoの内容を表示するように「echo $bango;」としてあります。
 この処理を実行するとどうなるかわかりますか?まず、postメソッドでデータを受け取り、変数$bangoにゼロをセットします。外側forループの1周目で「1行目」と表示します。内側forループは3回繰り返しますが、その1回目で$bangoの値は元々の0(ゼロ)に1を足すので1になり、2回目では1に1を足すので2になり、3回目では3になります。それぞれ表示して内側forループが終わって、外側forループが2周目に入ります。
 外側forループの2周目では、やはりまず「2行目」と表示し、内側forループを3回繰り返します。1回目では、$bangoの値が3になっているので1を足して4になり、2回目で5になり、3回目で6になります。内側forループが終わって、外側forループの3周目へ・・・・という具合に$bangoの値は最後には15になり、1~15の通し番号が完成します。最初は頭がグルグルしてくるかもしれませんが慣れればわかってきます。
 編集が済んだらlocalhost経由で動作確認して下さい。間違いがなければうまくいくでしょう。
 ここでは、繰り返し回数を管理する変数や、表示する数値を求めるための計算式を使って、数字そのものを表示するために使う例を確認しましたが、このような数値はHTMLタグの属性値として使うこともできます。いろいろ使う機会もあると思うので是非マスターしておきましょう。

  

7. テーブルの出力

 繰り返し処理の最後はテーブルの出力です。テーブルを何度も表示するのではありません。繰り返し処理でテーブルを生成します。

SPONSORED LINK

 テーブルを作るためのHTMLタグを思い出して下さい。思い出せない人はHTML復習編・表とリンクをどうぞ。いずれにせよ、テーブルは、次のような構造の<table>タグで実現しました。

  

 この図を見て「あれ?テーブルタグってもしかして繰り返しじゃね?」と思った人。正解です。よく見て下さい。縦方向の行の<tr>タグと横方向のセルの<td>タグの2重の繰り返しになっていますよね?同じパターンが繰り返されてます。
 というわけで、繰り返しを使ってテーブルを作り出す方法を考えます。サンプルを次のように編集して試しましょう。

  kihon06.html(基本タグは省略)
  

  kihon06.php(php部分以外は省略)
  

 説明します。まずkihon06.htmlには、テキスト入力の<input>タグを2つ追加しました。それぞれ「tate」「yoko」という名前が設定されています。
 次にkihon06.phpです。これもまずはpostメソッドでのデータ受け取り処理として「tate」「yoko」の分を追加しました。
 5行目で$bangoを0に初期設定した後、echo命令で<table>タグを出力しています。これに対応する終了タグ</table>は、最後から2行目にがありますので、入れ子になった2重のforループをこれらのタグがはさんでいる、という状況です。
 続いて外側forループです。「$j=0」から始まり、$jを1ずつカウントして「$j<$tate」の間繰り返す、という設定をしています。「$tate」は入力ページで受け取ったデータですので「3」と入力されていれば3回繰り返す。「10」なら10回繰り返す、ということになります。
 その外側forループの{ }の中を見ましょう。{ }の中の最初と最後、9行目と18行目(下から4行目)に<tr>と</tr>タグがecho命令で出力されています。<tr>~</tr>タグは、テーブルの行を指定するタグでしたので、外側forループは1回繰り返すたびに、テーブルの行が1段ずつ追加されていきます。
 続いて10行目から内側forループが始まります。内側ループは、「$i=0」から始まり、$iを1ずつカウントして「$i<$yoko」の間繰り返す、と指定されています。「$yoko」も入力ページで入力された値ですので、「4」と入力されていれば4回、「7」なら7回繰り返す、ということになります。
 一方、内側forループで繰り返す内容ですが、まず12行目の「$bango=$bango+1;」は上のサンプルで見た通り$bangoの値を1増やす処理。次の「echo '<td>'.$bango.$data.'</td>';」は、「<td>」と$bangoと$dataと「</td>」を「.」(ピリオド)で結合して表示しなさい、というecho命令です。つまりテーブルのセルを指定する<td>~</td>タグにデータを入れて出力しているわけです。そしてこのテーブルセルの出力は「$yoko」で指定された回数繰り返されます。つまり繰り返し回数が横方向のセルの数になるわけです。
 というわけで、kihon06.phpの処理は、kihon06.htmlで入力された縦と横の数値に応じて「縦×横」のテーブルを出力する、ということになります。
 編集が完了したらlocalhost経由で確認してみて下さい。思い通りになりましたか?「()」や「{}」、出力するHTMLタグの対応関係に間違いがないかよく確かめましょう。

  

  

(参考) whileとdo~while

 繰り返し処理はwhile命令やdo~while命令でも実現できます。ただ、個人的にはこれらの命令を使うことはあまりお勧めしません。下の例を見てもらうとわかるように、結局は「開始カウント数」と「繰り返しカウント範囲」と「回数カウント処理」で繰り返し指定をするわけですが・・・for命令に比べて見やすくない!と個人的に思うわけです。for命令なら繰り返し指定が「for( 開始カウント数; 繰り返しカウント範囲; 回数カウント処理 )」と1か所にまとまってますが、while命令やdo~while命令はまとまっていません。それから何よりfor命令(と次ページで紹介するforeach命令)を知っていれば他を知らなくても困らない、ということもあります。なのでお勧めしないわけです。ただ、while使い、do~while使いもいますので、そうした人が書いたプログラムを読むためには形ぐらいは知っておく必要があります。というわけで参考情報として書き方だけ示しておきます。詳しくは調べて下さい。

  while文
  
  (「あいう」を10回表示。while()の条件式で判定されてから{ }内を実行)

  do~while文
  
  (「いろは」を10回表示。while()の条件式の前にdo{ }内の命令が1回は実行)


SPONSORED LINK


練習問題

 このページで用いたファイルkihon06.htmlとkihon06.phpを使い、以下の課題に取り組みましょう。
  1. kihon06.phpを編集し、すでに作られたテーブルの下に、5×5の別のテーブルを追加しなさい。その際、このページのサンプルと同様に、2組のforループを入れ子にして実現すること。
  2. 追加した5×5の別のテーブルの各セルに「行番号-列番号」が表示されるようにしなさい。ただし、番号はforループの繰り返し回数をカウントする変数を使って出力するものとし、大きい番号から降順につけるものとする(例:左上から右へ5-5、5-4、5-3・・とし一番右下が1-1」となる形)。
練習問題の出力例

ページのトップへ戻る
SPONSORED LINK