PHP復習3
■データの読み込み
プログラムに外部からのデータを読み込む際のあれこれが下記。
・webページ
インターネット経由でamazonから商品を読み込みランダムでおすすめを表示する、ツイッターで特定のつぶやきを取得する、等。
・データベース
データベースシステムよりSNSの会員情報を取得したり、
通常のPCのように、txtやjpgなど、ファイルとして保存されたデータを読み込む。
・標準入力
■標準入力
・fgets(STDIN)
標準入力されたデータをプログラムの方で取得するのにtgetsという関数を使う。
例1
入力値
hello paiza
<?php
$input = fgets(STDIN);
echo "標準入力値:".$input;
?>
このような場合、出力値は下記になる。
標準入力値:hello paiza
・入力値が2行以上の場合
fgets(STDIN)は1行ずつしか値を読み込まない。例えば入力を下記のように2行にした場合。
入力値
5
4
これを例1のプログラムで出力すると、「標準入力値: 5」としか出力しない。
2行目を読み込みたい場合が例2。
例2
<?php
$input = trim(fgets(STDIN));
$input2 = trim(fgets(STDIN));
echo "標準入力値:".$input."\n";
echo "標準入力値2:".$input2."\n";
echo $input+$ainput2;
?>
また、入力値自体に改行コードが含まれているので、そのままだと改行が2回入ってしまう。このような場合は、出力側の改行を取るのではなく、変数側の改行を取るようにする。何故なら、変数は様々な場合で使う場合が多いので、意図しない改行が入っていると後々バグに繋がってしまう。よって、値を出力するときに取り除く。
・trim
この関数で、文字列の前後に入ってる半角スペースや、改行コードを取り除くことができる。
■while文によるループ処理
・while文の基本式
<?php
while(ループを続ける条件式){
//繰り返し実行する処理
}
?>
もし()の条件式が成り立つ場合は//の処理を実行し、繰り返す。もし1~10を出力したい場合は例3になる。
例3
<?php
$i = 1;
while($i <= 10){
echo $i;
$i++;
}
?>
この際、$i++を書かないと、永遠にループ処理が続く。このようにループから抜け出さないプログラムを実行すると、cpuを占有してしまうので注意。
また、$Iのようにループの数を数える変数のことをカウンタと言う。カウンタの変数はなんでもいいが、$iや$jが使われることが多い。
・年齢入力フォームでの利用例
例4
<select name="age">
<option>1才</option>
<option>2才</option>
<option>3才</option>
<option>4才</option>
<option>5才</option>
<option>1才</option>
<option>2才</option>
<option>3才</option>
<option>4才</option>
<option>5才</option>
</select>
このような年齢入力フォームを作りたいとき、これをHTMLで100才まで作るとなると、膨大なコピペ&年齢の書き換え作業が必要になる。これをプログラムによって自動化したい場合が例5.
例5
<select name="age">
<?php
$i = 1;
while($i <= 100){
echo "<option>".$i."才</option>";
$i++;
}
?>
</select>
■for文によるループ処理
for(初期化式; 条件式; 変化式){
//繰り返し実行する処理
}
1から10を出力する同じ処理をwhileと比較すると例6になります。
例6
<?php
for($i = 1; $i <= 10; $i++){
echo $i."\n";
}
?>
<?php
$i = 1;
while($i <= 10){
echo $i."\n";
$i++;
}
?>
数学で値を求めるときに様々な計算方法があるのと同じで、書いていることは同じだということがわかると思います。よりスマートに計算しただけです。
■for文の応用
西暦と平成の対応表を例7に書いてみます。
例7
<?php
for($year = 1989; $year <=2015; $year++){
$heisei = $year - 1988;
echo "西暦".$year."年は平成".$heisei."年です\n";
}
?>
平成元年の1989年~2015年までをループで出力する
ループの各西暦年出力時に平成年を計算して出力する
1989 + x = 1
x = 1 - 1989
x = -1988
よって、$heiseiは$year - 1988になります。