今回は星座の判別できるプログラムを作成してみました。前回の干支がわかるプログラムとあわせて作ってみました。
ただ今回のプログラムはあんまり利用価値はないのかなと。星座は表を見ればすぐに分かることですのでわざわざプログラムにする必要はないのですが日付関数の練習には良いと思います。
最近は日付関数はdate系ではなくDateTimeクラス関数を使っております。日付クラスは便利で使いやすいですね。ちょこっと書くだけならdate関数が楽ですけど、今後はこっちのDateTime関数が主流になるので慣れておきましょう。
スポンサーリンク
星座
下記が星座ですね。
牡羊座(3月21日~4月19日)
牡牛座(4月20日~5月20日)
双子座(5月21日~6月21日)
蟹座(6月22日~7月22日)
獅子座(7月23日~8月22日)
乙女座(8月23日~9月22日)
天秤座(9月23日~10月23日)
蠍座(10月24日~11月21日)
射手座(11月22日~12月21日)
山羊座(12月22日~1月19日)
水瓶座(1月20日~2月18日)
魚座(2月19日~3月20日)
さてこれをどのように扱うか、パッと思いついたのが日付を配列にして入れて星座の名前で変数にする方法です。
function getTermDay($start, $end) {
$term = array();
$start_date = new DateTime($start);
$end_date = new DateTime($end);
$interval = new DateInterval('P1D');
foreach (new DatePeriod($start_date, $interval, $end_date) as $day) {
$term[] = $day->format('n-j');
}
return $term;
}
とりあえず上記のような関数を作って
$ohituji = getTermDay($year.’-3-21′, $year.’-4-19′);
こんな感じで入れていきます。西暦も必要なので入力した値を$yearに入れてチェックします。
$date = $month . '-' . $day;
if (in_array($date, $ohituji)) {
$seiza = 'おうし座';
}
入力した値を$dateにハイフン付きで入れてin_array関数でチェックする、ヒットすれば星座の名前が入るという感じです。
//送信ボタンを押したら以下の処理
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$year = escape($_POST['year']);
$month = escape($_POST['month']);
$day = escape($_POST['day']);
// 日付が正しければ処理
if (checkdate($month, $day, $year) === true) {
// 月と日をハイフン付きで取得
$date = $month . '-' . $day;
// 各星座の日付を取得
$ohituji = getTermDay($year.'-3-21', $year.'-4-19');
$oushi = getTermDay($year.'-4-20', $year.'-5-20');
$futago = getTermDay($year.'-5-21', $year.'-6-21');
$kani = getTermDay($year.'-6-22', $year.'-7-22');
$shishi = getTermDay($year.'-7-23', $year.'-8-23');
$otome = getTermDay($year.'-8-24', $year.'-9-22');
$tenbin = getTermDay($year.'-9-23', $year.'-10-23');
$sasori = getTermDay($year.'-10-24', $year.'-11-22');
$ite = getTermDay($year.'-11-23', $year.'-12-21');
$yagi = getTermDay($year.'-12-22', ($year + 1) .'-1-20');
$mizukame = getTermDay($year.'-1-21', $year.'-2-18');
$uo = getTermDay($year.'-2-19', $year.'-3-20');
// 各星座と日付が同じなら文字列を出力
if (in_array($date, $ohituji)) {
$seiza = 'おうし座';
}elseif (in_array($date, $oushi)) {
$seiza = 'おひつじ座';
}elseif (in_array($date, $futago)) {
$seiza = 'ふたご座';
}elseif (in_array($date, $kani)) {
$seiza = 'かに座';
}elseif (in_array($date, $shishi)) {
$seiza = 'しし座';
}elseif (in_array($date, $otome)) {
$seiza = 'おとめ座';
}elseif (in_array($date, $tenbin)) {
$seiza = 'てんびん座';
}elseif (in_array($date, $sasori)) {
$seiza = 'さそり座';
}elseif (in_array($date, $ite)) {
$seiza = 'いて座';
}elseif (in_array($date, $yagi)) {
$seiza = 'やぎ座';
}elseif (in_array($date, $mizukame)) {
$seiza = 'みずかめ座';
}elseif (in_array($date, $uo)) {
$seiza = 'うお座';
}
} else {
$seiza = 'エラーです!日付が間違っています。';
}
}
// 期間を取得する関数
function getTermDay($start, $end) {
$term = array();
$start_date = new DateTime($start);
$end_date = new DateTime($end);
$interval = new DateInterval('P1D');
foreach (new DatePeriod($start_date, $interval, $end_date) as $day) {
$term[] = $day->format('n-j');
}
return $term;
}
// エスケープ処理
function escape($string){
return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
;?>
上記がプログラム全文です。なんとなくもっとスッキリと書けそうなんですけど、とりあえずわかりやすいので乗せておきます。
HTML部分です。生年月日をクリックして送信したら星座が表示するという単純なものです。
デモページで確認できます。デモページでは干支と星座が出ます。