for文の書き方と特徴(他のループ処理との違い)

Q:”for文は繰り返し処理”それは知っているでも他のループ処理と何が違うの??

A:繰り返す回数が決まっている場合に使う

そして、最もよく使われるループ処理!

 

書き方

for(初期値; 条件式;増減式){

  //処理内容

}

 ※注意:「;」で閉じなくてOK。

条件式がfalseになるまでループさせるよ

 

ネスト(入れ子) ※重要

ループ処理全般だが、for文のループ処理を紹介

for文の中にfor文がある状態で、ネストすることにより、コードがシンプルになるメリットがありますが、何重にもしてしまうと、どういう動作をしているかが分かりにくくなってしまうため、2重、3重くらいまでにするのがおすすめ。

 

使いどころ

1.あるfor文のループ処理、そのものを、N回行いたいとき。

2. 表示(もしくはほしい)したい1つの結果の中に、変動する数値が複数あるとき。

(※変動する数値分、条件が必要な時)

 

練習問題 

Q:全学年のクラスを一覧で出してくれ

表示すべきリスト

1年1組,1年2組,1年3組,1年4組,1年5組,
2年1組,2年2組,2年3組,2年4組,2年5組,
3年1組,3年2組,3年3組,3年4組,3年5組,
4年1組,4年2組,4年3組,4年4組,4年5組,
5年1組,5年2組,5年3組,5年4組,5年5組,
6年1組,6年2組,6年3組,6年4組,6年5組,

 

A:考え方と回答

表示すべきリストを思い描いた時、クラスごとのループ処理を学年分する必要があると考える。また、クラスだけではなく、学年も変数(条件式)になりそうだなと考える。

この時点で、

「(学年ごとの)クラスデータを、学年分ループ処理する」と思い浮かべればベスト!

 

 

①俺は初めてだから一番小さいループ処理から考えた…

最小単位の 「〇年△組,」 が5つ、 △の数値が変数のfor文をとりあえず作る。

for($class = 1; $class <= 5; $class++){
  echo  "1年" . $class . "組" . ",";
}

結果:1年1組,1年2組,1年3組,1年4組,1年5組,

 

②次は学年分まるっとループ処理させる!

①のループ処理を学年ループ処理したいから思い切って学年のループ処理でがばっと囲んでしまう。!

for($yesr = 1; $yesr <= 6; $yesr++){

      for($class = 1; $class <= 5; $class++){
        echo $yesr . "年" . $class . "組" . ",";
      }

echo "<br>";  

 

結果:できた!!

1(1)年1組,1年2組,1年3組,1年4組,1年5組,
2年1組,2年2組,2年3組,2年4組,2年5組,
3年1組,3年2組,3年3組,3年4組,3年5組,
4年1組,4年2組,4年3組,4年4組,4年5組,
5年1組,5年2組,5年3組,5年4組,5年5組,
6年1組,6年2組,6年3組,6年4組,6年5組,

 

 ■  おまけA(if文で表示内容を分岐)

例えば、もし、3年生だけ、3クラスしかない場合

つまり、表示する内容を変えないといけない時。

”もし、3年生だけ” なので if($yesr === 3) とプログラミング言語に変換。

そして入れる!

for($yesr = 1; $yesr <= 6; $yesr++){
  if($yesr === 3){
   for($class = 1; $class <= 3; $class++){
       echo $yesr . "年" . $class . "組" . ",";}
  }else{
  for($class = 1; $class <= 5; $class++){
       echo $yesr . "年" . $class . "組" . ",";
  }
 }
 echo "<br>";

 

 ■ おまけB(if文のcontinueで特定の条件だけスキップ)

 例えば、3年生だけいない学校の場合

つまり、特定のケースだけループ処理しないでほしい

(私のことはほっといて! 状態)

for($yesr = 1; $yesr <= 6; $yesr++){
  if($yesr == 3){
    continue;

  }
  for($class = 1; $class <= 5; $class++){
       echo $yesr . "年" . $class . "組" . ",";
  }
 echo "<br>";

結果:スキップできた!

1年1組,1年2組,1年3組,1年4組,1年5組,
2年1組,2年2組,2年3組,2年4組,2年5組,
4年1組,4年2組,4年3組,4年4組,4年5組,
5年1組,5年2組,5年3組,5年4組,5年5組,
6年1組,6年2組,6年3組,6年4組,6年5組,

※3年生の行がスキップされる

※もし何か表示したい場合はif文の処理内にecho などの処理結果を表示

 

 

■ おまけC(if文のbreakで特定の条件になったら強制終了!)

 例えば、急に2年生より上の学年が別の学校へ移った場合

つまり、2年生より上の学年をループ処理しないでほしい

($year変えろよって話だけど言わない)

for($yesr = 1; $yesr <= 6; $yesr++){
  if($yesr == 3){
    break;

  }
  for($class = 1; $class <= 5; $class++){
       echo $yesr . "年" . $class . "組" . ",";
  }
 echo "<br>";

結果:スキップできた!

1年1組,1年2組,1年3組,1年4組,1年5組,
2年1組,2年2組,2年3組,2年4組,2年5組,

 

breakは、continueと違って、ループの先頭に戻らないので

ループ処理そのものが ”終了” となる。