PHP学習 ③

プログラミング学習 PHP入門

引き続きpaiza動画学習のPHP入門編(全5レッスン)に取り組む
レッスン3でwhile、forのループを学習する


その前にまず、プログラムの外部からデータを読み込む方法について学ぶ。


★データの読み込み(標準入力)の概念

プログラムを書いていたりシステムを作っていると
プログラムに何かしらのデータを読み込ませて処理をしたいということが起こる。

読み込む先としては他のウェブページや、データベースのほか、
エクセルなどのファイルシステムやプログラム起動時の標準入力などの方法がある。

ウェブページのデータ読み込みとはどういうことかというと、
例えばツイッターのタイムラインを読み込んで特定のつぶやきだけを取り出す時や
アマゾンから商品を読み込んでランダムで商品をオススメしたいときに
ウェブページにインターネット経由で問い合わせをしてデータを取得するという流れを指す。

次にデータベースの場合。
これは、データベースシステムに問い合わせをしてデータを取得してくるやり方を指す。
例えば、SNSであれば会員情報を取得したりするときに使う。

ファイルシステムの場合、これは通常のテキストやJPEGやCSVなどの
ファイルとして保存されたデータを問い合わせて読み込むやり方。

標準入力は、簡単に言うと、プログラム起動時に与えられるデータということになる。
実際のウェブサービスの開発においては標準入力を使うことはほとんどない。
paizaではファイル読み込みの代わりに使っておりファイル読み込みの一種と考えておく。


データ取得というところで標準入力について見ていくが
文字に起こすよりも動画で見た方がわかりやすいので再度閲覧して確認する
https://paiza.jp/works/php/primer/beginner3/2116


標準入力エリアに書かれているデータを取り出すにはfgets関数を用いる。

■fgets() 関数
ファイルポインタから 1 行取得する。
fgets(STDIN) で標準入力で与えられたデータを1行取得する事が出来ます。

入力値が2行以上の場合、fgets(STDIN)をもう一行プログラムに書いてやることで
入力値の2行目を読み込むことができる。

■trim() 関数
文字列の先頭および末尾にあるホワイトスペースを取り除く。

入力値の後の改行が変数の中に含まれているとバグの原因となるので
必ずデータ取得時に無駄な改行などを取り除いておくことが大切。

また数値を取得してきている場合は読み込んだ数値を使っての計算もできる。

入力エリアには例えばCSVファイルなどの大きなデータを貼り付けることもできる
今後色々なデータを処理するやり方を見ていく。

まずは以下のphpコードによって入力値を変化させると出力値も変わることをしっかりと抑えたい。
<?php
$input = trim(fgets(STDIN));
$input2 = trim(fgets(STDIN));
echo "標準入力値:".$input."\n";
echo "標準入力値2:".$input2."\n";
echo $input+$input2;
?>



ではいよいよwhile文を使ったループ処理(繰り返し処理)の基本を学んでいく。
プログラミングにおいてループ処理は条件分岐と同じくらい重要で様々なところで
使うのでしっかりマスターすること。

★while文の書き方

while(ループを続ける条件式){
// 繰り返し実行する処理
}


<?php
$i = 1;
while($i <= 10){
   // 繰り返し実行する処理
   echo $i."\n";
   $i++;
}
?>

単行演算子を用いたカウントアップ処理を行い
必ず無限ループを避ける点に注意。
CPUを占有しタイムアウト要因となる。

出力結果と見比べながら進めたほうがわかりやすいので
動画で確認する。
https://paiza.jp/works/php/primer/beginner3/2117;



while文を使って、プロフィール登録などでよく見られる
年齢入力フォームをの作り方について学ぶ。
HTMLの中にPHPを書くので混乱しないように注意すること。

年齢入力フォーム作成
<select name=“age”>
<?php
$i = 1;
while ($i <=100){
 echo “<option>”.$i.”歳</option>”;
 $i++;
?>
</select>



生まれ年のプルダウン作成
<select name="year">
<?php
$i = 2010;
while($i <=2015){
echo "<option>".$i."年生まれ</option>\n";
$i++;
}
?>
</select>



以上のwhile文をしっかりとマスターしてループの概念になれたら
少し複雑ではあるがよりスマートなfor文をマスターする!


★FOR文でループをスマートに
for文を使うとループ処理をよりスマートに書く事が出来るので
こちらもしっかりマスターする!!

 for文の書き方            (要暗記)
for(初期化式; 条件式; 変化式){
// 繰り返し実行する処理
}

1〜10までループさせるために
while文を用いて書くと

<?php
$i = 1;
while($i <= 10){
    echo $i."\n";
    $i++;
}
?>

となるが、このwhile文をfor文に書き換えると、

<?php
for($i = 1; $i <= 10; $i++){
    echo $i."\n";
}
?>

となる。しっかり押さえておくこと。
また、手癖で慣れるまで書くことが大切。

for文はデータを1行ずつ処理するときや
同じ処理を何度も実行する時に必須の構文なので
しっかり身につけること。

__________________

演習!標準入力とfor文の組み合せ!
標準入力で二つ(2行)の整数が与えられます。
1行目の数値から2行目の数値までを1づつ加算しながら
1行づつ順番に出力するプログラムをfor文で書いてください。
※1行目の数値は2行目の数値よりも必ず小さいものが与えられるものとします。

入力される値
3
9

<?php
$input = trim(fgets(STDIN));
$input2 = trim(fgets(STDIN));

for($input; $input <= $input2; $input++){
    echo $input."\n";
}

?>


出力値
3
4
5
6
7
8
9


___________________


演習課題「指定行数分、標準入力を取得する」
標準入力の1行目に、それ以降何行の入力があるかが整数で示されます。
1行目で示された行数分の標準入力を取得して、改行なしで出力してみましょう。

 入力される値
4
a
b
c
d

 期待する出力値
abcd



<?php
$input = trim(fgets(STDIN));
for($i = 0 ; $i < $input; $i++){
echo trim(fgets(STDIN));
}
?>


解答1
カウンタ($i)を0からスタートした場合の書き方(模範解答)
<?php
// 1行目の標準入力を取得
$input1 = trim(fgets(STDIN));

// $input1の回数分だけループを回す
for($i=0; $i < $input1; $i++){
    // 2行目以降の標準入力の取得
    echo trim(fgets(STDIN));
}
?>


解答2
カウンタ($i)を1からスタートした場合の書き方
<?php
$input1 = trim(fgets(STDIN));
for($i=1; $i <= $input1; $i++){
    echo trim(fgets(STDIN));
}
?>


解答3
while文で書いた場合の書き方
<?php
$input1 = trim(fgets(STDIN));
$i = 0;
while($i < $input1){
    echo trim(fgets(STDIN));
    $i++;
}
?>




★西暦年と平成年の対応表の作り方

一つの年だけでなく、1989年から2015年までを全部出力する方法

平成元年=1989〜2016までをループで出力する
ループの各西暦年出力時に平成年を計算して出力

<php?
for($year = 1989; $year <=2016; $year++){
 $heisei = $year - 1988;
 echo “西暦”.$year.”年は平成”.$heisei.”年です。\n”;
}
?>

西暦と昭和の対応表は以下となる。要点は同じ。

<?php

for($year = 1926; $year <=1989; $year++){
   $syowa = $year - 1925;
   echo "西暦".$year."年は、昭和".$syowa."年です。\n";
}
?>




演習課題「特定期間の西暦年と昭和年の対応表を出力」
右側のエディターエリアのプログラムをもとに、標準入力1行目で
与えられる西暦年から、標準入力2行目で与えられる年数分の
西暦年と昭和年の対応表を出力するプログラムを完成させてください。

出力は1行ずつ「西暦19○○年は、昭和○○年です」と出力してください。

※標準入力1行目で与えられる西暦年は、昭和年の範囲を超える事はありません。
※標準入力2行目で与えられる年数についても、昭和年の範囲を超える事はありません。

 入力される値
1975
10


<?php
$start_year = trim(fgets(STDIN)); // 標準入力1行目取得 開始年
$term = trim(fgets(STDIN)); // 標準入力2行目取得 表示年数
$end_year = $start_year + $term; // ループ終了年の計算
for($i=$start_year ; $i<$end_year; $i++){
    $showa = $i-1925;
    echo "西暦".$i."年は、昭和".$showa."年です。\n";
}
?>


標準入力を取得してfor文を書くことがどうやら苦手らしい。
$iをおいて、取得したデータを組み合わせて得られる代入演算子との比較演算によって
無限ループを避けるという発想がなかった。反省。
しっかりと知識を定着させてしっかりと駆使できるようにする。



次回は配列の基礎について学ぶ前に、習熟度テストとして演習問題を解いてから始める。


コメント

このブログの人気の投稿

PHP学習 ④

LINEスタンプ⑦