PHP実習:while/forで繰り返し
今日も勉強をしていきましょうぞ。
第5章-01
この章では「while/forで処理を繰り返す」ということについて。
まずはおさらい。
<?php
$i=1;
while($i<=20){
echo $i.'行目です。<br>';
$i++;
}
これだけで画面には20行の文章が表示される。
ドットインストールのときにやったっけ、whileとifの混合文もこの通り。
<?php
$i=1;
while($i<=30){
if($i%3===0){ //%は余りを求める演算子
echo$i.'は3の倍数です。<br>';
}
}
ちなみに、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~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>';
if使う必要ないやん…という解答が後半のもの。後半だけなら$totalに0を代入するところもなくせるので、後半の方が見栄えはすっきるするはず。単元の趣旨からすればたぶん前半が正解。
第5章-03
forとwhileの違いをおさらい。
for ($i=1; $i<= 8 ; $i++) {
echo $i."行目です。<br>";
}
for{ 初期値 ; 条件式 ; 増減式}で構成される。区切りはセミコロン。
第5章-03 練習問題
- forで1から10までの数字を足した合計を求めよ。
- <p>タグを使い、以下のような表示をさせよ。
1行目です。
2行目です。
3行目です。
4行目です。
5行目です。
<?php
//練習1 解答
for ($i=1; $i<=10 ; $i++) {
$total+=$i;
}
echo "1から10までの合計値は".$total.'です。';
?>
こんな感じ。
<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のみが表示されていることが分かる。
第5章-04 実習
生年月日を選択するフォームを作る。
直接入力してもらうのではなく、コンボボックスで選択肢を用意する。年については自動で現在の値(2018)を取得するようにしたい。流れとしては、
- 西暦で現在の年を取得
- 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>
ここまで書くとこうなる(月の後ろの改行はいらないので次のスクショでは外します)。
次に、現在の年を取得する。
<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を閉じる終わりのかっこである。
上手くループを作成し、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>日
一気に難易度というか、コードの複雑さが跳ね上がった気がする…。
しかし、落ち着いてやればなんということはないのだ。
これにて実習課題は完成。ここからはオリジナルの一工夫。
このサイトを開いたとき、表示されている日付は「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>日
心配して損した…よかった…!!デベロッパーツールで確認しても月で6を入れているところにselectedと出ているのでこれが初期値として設定されている。日付も同様。
これにて終了!!今までで一番悩んだけどよかった!!