次回処方日の計算
これが非常に苦手です。何度やっても理解できないのです。
なので、自動計算のシステムを作ってみようと思います。
一応、到達点としては用法も加味したシステムですので、用法不要であればjavascriptで動的に作ることもできますが、今回はPHPで作ります。コーディングの練習用に2種類作ってもいいかもしれませんね。
変わらず、今回もPHPは同一ページでの入力と表示を目指す予定です。
まずは、日にちの自動計算です。
日にちというのは文字(str)や数字(int)と異なる属性です。
コンピュータでは文字は足し算の足し算は結合されてしまいます。
通常のプログラミング言語では文字は以下のようになります。
は + る = はる
しかし、数字の場合も以下のようになります。
1 + 1 = 11
これは数字の「1」ではなく、文字としての「1」を認識してしまっているためです。
これを文字(string)ではなく、数字(integer)として認識させる必要があります。
(pythonなんかの言語では自動判断してくれますが)
同様に、日付も特殊な属性を持ち、計算結果が自動繰り上げされるようになります。
数字としての"20180516"は加算すると以下のようになります。
20180516 + 365 = 20180696
しかし、これに日にちとしての属性を持たせると、以下のようになります。
20180516 + 180 = 20181112
このように、その文字列の持つ属性がプログラミングでは非常に重要になります。関数や引数、変数なんかも同様です。
今回はPHPでの計算ですので、まずは入力された文字列を日にちとして組み込まなければいけません。
その際に使用する関数がdate_createですが、今回はDateTimeクラスを使用します。また、いつもの手続き型ではなく、オブジェクト指向にチャレンジしてみます。
//ここからプログラムの内容
まず、入力の西暦部分は変更することがほとんどないと思われるので、最初から入力されていて問題はないので、(念の為、日本標準時(東京)に時刻を設定して)西暦を引っ張ってきます。
ーーーーー
西暦<input type="text" name="指定する西暦" autocomplete="off"
value="<?php
//日本標準時の時間で設定
date_default_timezone_set(' Asia/Tokyo ');
//$nowyearを指定し、DateTimeとして内容を設定。
$nowyear = new DateTime();
//$nowyearの内容は日にちとしての属性を持っているので、そのY(西暦)の部分を取り出して表示
echo $nowyear->format('Y');
?>" />年
ーーーーー
これで、inputのテキストエリアに自動で現在の西暦が入力されます。
月日についても同様に入力しておきます。
これらをformからaction=""で同一ページに飛び、内容をPOSTします。
ーーーーー
<form action="" method="post">
<input ~上記のコード~ />
//処方日数の指定はPOSTした後に削除されないようにvalueの値を指定
<input name="処方日数" type="text" autocomplete="off" value="<?php echo $_POST['処方日数']; ?>" style="text-align: right;"/>
<input type="submit" value="計算" />
<form />
ーーーーー
この辺りはHTMLの知識かもしれませんね。少しCSSも加えてますが。
POSTされた数字は、念の為全角を半角に強制的に修正しておきます。
これはmb_convert_kana関数を使用すると楽です。全角→半角や半角→全角など、入力された文字を強制的に変換させます。Drug Searchでも使用しています。薬の検索は半角カタカナ・数字になるとパターンマッチできない(正規表現的に異なってしまう)、なんて互換性無くなってしまうとマズいので強制的に全角に変換してしまうわけです。
ーーーーー
$_POST['指定された年'] = mb_convert_kana($_POST['指定された年'],"a");
//同様に月日も設定(内容は略)
//再度DateTimeクラスを使用して、指定された日にちの計算を行います。
$date = new DateTime();
//POSTされた数字をDateTimeの日にちに入力
$date->setDate($_POST['指定された年'],$_POST['指定された月'],$_POST['指定された日']);
//入力された数字を加算(指定日は服用を「開始」する日なので、更に1日引く)
$date->add(new DateInterval('P'.$_POST['加算する日数'].'D'));
$date->sub(new DateInterval('P1D'));
//DateTimeクラスの曜日は数字に割り当てられているので、配列を利用して番号=その番目の文字に変換
$week = array("日","月","火","水","木","金","土");
//計算された日にちを表示
echo $date->format('Y年m月d日');
//曜日を数字から文字に変換して表示
$weeknum = $date->format('w');
echo "(",$week[$weeknum],")";
ーーーーー
と、他にも内部でいろいろやってますが、大まかにこんな感じです。PHPだとサーバー側で処理しているので、コードが見れないのが難ですが、そんな感じのことしてるんだなー程度に理解していただければいいのかなと。
なかなか帰宅後の時間で作るのも難しいですが、今後もちまちまとやっていきたいと思います。