あーる学習帳

自分が勉強したことや気になることなど、99%自分用です。コードを書いてるのでPCから閲覧を推奨。

PHP実習:while/forで繰り返し

今日も勉強をしていきましょうぞ。

 

第5章-01

この章では「while/forで処理を繰り返す」ということについて。

まずはおさらい。

<?php

$i=1;

while($i<=20){

 echo $i.'行目です。<br>';

 $i++;

 これだけで画面には20行の文章が表示される。

f:id:R_de_aru:20180621203300p:plain

ドットインストールのときにやったっけ、whileとifの混合文もこの通り。

<?php

$i=1;

while($i<=30){

 if($i%3===0){ //%は余りを求める演算子

  echo$i.'は3の倍数です。<br>';

 }

 

f:id:R_de_aru:20180621203644p:plain

ちなみに、whileの条件文を$i>0に書き換えてしまうと無限ループが発生する。条件に付いては無限ループにはまらないよう、気を付けて書くこと。本当に終わらないぞ。

 

第5章-02

複合演算子についてまとめる。どれもイコールの前に演算子が付く

+= 値を加えて代入する。「$a+=2」=「$a=$a+2」

-= 値を引いて代入する。「$a-=2」=「$a=$a-2」

*= 値を掛けて代入する。「$a*=2」=「$a=$a*2」

/= 値を割って代入する。「$a/=2」=「$a=$a/2」

%= 値を割って余りを代入する。「$a%=2」=「$a=$a%2」

.= 文字列を連結して代入する。「$a.=$b」=「$a=$a.$b」

 第5章-02 練習問題

  1. 1~100までの整数のうち、7の倍数の和を求めよ。

<?php

//解答その1

$i=1;
while ($i<=100) {
 if ($i%7===0) {
  $total+=$i;
 }
 $i++;
}
echo '7の倍数の合計は'.$total.'です。<br>';
 //解答その2

$i=7;
$total=0;
while ($i<=100) {
 $total+=$i;
 $i+=7;
}
echo '(別解)7の倍数の合計は'.$total.'です。<br>';

f:id:R_de_aru:20180621210919p:plain

if使う必要ないやん…という解答が後半のもの。後半だけなら$totalに0を代入するところもなくせるので、後半の方が見栄えはすっきるするはず。単元の趣旨からすればたぶん前半が正解。

 

第5章-03

forとwhileの違いをおさらい。

for ($i=1; $i<= 8 ; $i++) {
 echo $i."行目です。<br>";

 for{ 初期値 ; 条件式 ; 増減式}で構成される。区切りはセミコロン。

第5章-03 練習問題

  1. forで1から10までの数字を足した合計を求めよ。
  2. <p>タグを使い、以下のような表示をさせよ。

1行目です。

2行目です。

3行目です。

4行目です。

5行目です。 

<?php
 //練習1 解答
 for ($i=1; $i<=10 ; $i++) {
  $total+=$i;
 }
 echo "1から10までの合計値は".$total.'です。';
?>

こんな感じ。

f:id:R_de_aru:20180621210209p:plain

<html>

<!-- 練習2 解答 -->
 <head>
  <meta charset="utf-8">
 </head>
 <body>
  <?php
   for ($i=1; $i<=5; $i++) {
    echo '<p>'.$i.'行目です。<br></p>';
   }
  ?>
 </body>
</html> 

デベロッパーツールで確認すると、PHPで書いたところは表示されずにHTMLのみが表示されていることが分かる。

f:id:R_de_aru:20180621211407p:plain

 

第5章-04 実習

生年月日を選択するフォームを作る。

直接入力してもらうのではなく、コンボボックスで選択肢を用意する。年については自動で現在の値(2018)を取得するようにしたい。流れとしては、

  1. 西暦で現在の年を取得
  2. forを使ってoptionタグを繰り返し出力

というものになる。今回の要件定義は…

  • <select>タグのオプション部分をプログラムで作る
  • 西暦1950年から現在の年までオプションで表示
  • 月は12月まで、日は31日まで

まずはHTMLを作成。

<html>
 <body>
  <h1>生年月日を入力するフォームを作ろう</h1>
  <label for="year">西暦</label>
  <select name="year">
   <option value="1980">1980</option>
   <option value="1981">1981</option>
  </select>年
  <br>
  <select name="month">
   <option value="1">1</option>
   <option value="2">2</option>
  </select>月
  <br>
  <select name="day">
   <option value="1">1</option>
   <option value="2">2</option>
  </select>日
 </body>
</html> 

 ここまで書くとこうなる(月の後ろの改行はいらないので次のスクショでは外します)。

f:id:R_de_aru:20180621212605p:plain

次に、現在の年を取得する。

<select name="year">の次の行にPHPを書く。

<select name="year">
 <?php
  $now=date("Y")
 ?>
</select>年

date()引数に応じて日付に関する文字列を返してくれる。引数は以下の通り。

d...日(2桁) 例:05、15

D...曜日(3文字のテキスト) 例:Sun、Mon

m...月(2桁) 例:04、12

Y...年(4桁) 例:1992、2018

H...時(2桁、24時間単位) 例:08、20

i...分(2桁) 例:05、50

s...秒(2桁) 例:03、30

<select>タグの仕組みについてまとめる。

<select>タグのnameは受け取り時のキーとなり、$_POST['user_name']のような形で取得できる。<option>タグでは<option></option>で囲まれた部分が表示されるが、実際に送信されるのはvalueで設定した文字列となる。

<select name="year">
 <?php
 $now=date("Y");
 for($i=1950;$i<=$now;$i++){ ?> <!-- いったんPHPを閉める-->
 <option value="<?php echo $i; ?>"><?php echo $i; ?></option>
 <?php } ?>
</select>年 

すごいことになったので、PHP部分の文字色を変えておく。

forループを宣言した後に一度PHP部分を終了し、valueの値と実際に表示する文字列の部分で再度PHPを始める。このときに年を入れる。最後の<?php } ?>はforを閉じる終わりのかっこである。

f:id:R_de_aru:20180621214149p:plain

上手くループを作成し、1950年~2018年までを表示できた。

同じように月日についてもループで作成していく。

<select name="month">
 <?php
 for($i=1;$<=12;$i++){ ?>
 <option value="<?php echo $i; ?>"><?php echo $i; ?></option>
 <?php } ?>
</select>月
<select name="day">
 <?php
 for($i=1;$i<=31;$i++){ ?>
 <option value="<?php echo $i;?>"><?php echo $i;?></option>
 <?php } ?>
</select>日 

 一気に難易度というか、コードの複雑さが跳ね上がった気がする…。

f:id:R_de_aru:20180621215012p:plain

f:id:R_de_aru:20180621215027p:plain

しかし、落ち着いてやればなんということはないのだ。

これにて実習課題は完成。ここからはオリジナルの一工夫。

このサイトを開いたとき、表示されている日付は「1950年1月1日」となってしまう。

これだとユーザーに配慮しているとは言い難い。そこで、

  • サイトを表示したとき、表示される日付の初期値は今日とする

今日サイトを開いたら初期値は「2018年6月21日」となればよい。

<select>タグについて調べてみたところ、以下の書き方を初期値に設定したいところで書ければよいらしい。

<select name="year">

 <option value="2016">2016</option>

 <option value="2017">2017</option>

 <option value="2018" selected>2018</option> 

</select>

初期値となるところにselectedを加えられれば…!!

今回出てきたdate()とその引数をうまく使えば行けそうである。

試行錯誤して、年の部分をこのように書けば初期値が現在のものに設定できた。

<select name="year">
 <?php
 $now=date("Y");
 for($i=1950;$i<=$now;$i++){ ?>
 <option value="<?php echo $i;?>"<?php
 if ($i==date("Y")) {
  echo " selected";
 }
 ?>><?php echo $i; ?></option>
 <?php } ?>
</select>年

if文と組み合わせ、$iとdate("Y")が一致すれば<option>タグにselectedを足すようにした。これを月と日の部分でも同じようにすればいいのだが、6月21日が$iは「6」、date('m')は「06」を持ってしまって初期値が設定できない…なんてことはないだろうか。とりあえず書いてみる。

<select name="month">
<?php
 for($i=1;$i<=12;$i++){ ?>
 <option value="<?php echo $i; ?>"<?php
 if($i==date('m')){
  echo " selected";
 }?>
><?php echo $i; ?></option>
<?php } ?>
</select>月


<select name="day">
 <?php
 for($i=1;$i<=31;$i++){ ?>
 <option value="<?php echo $i;?>"<?php
 if($i==date('d')){
  echo " selected";
 }
 ?>
 ><?php echo $i;?></option>
 <?php } ?>
</select>日 

f:id:R_de_aru:20180621220926p:plain

心配して損した…よかった…!!デベロッパーツールで確認しても月で6を入れているところにselectedと出ているのでこれが初期値として設定されている。日付も同様。

これにて終了!!今までで一番悩んだけどよかった!!