PHPで特定の日間の日付を for、strtotimeで表示する
2014/04/05
ある特定の日とある特定の日の間の日付を表示する
for文の条件に strtotimeを使う
ある特定の日とある特定の日の間の日付を取得する処理を作る必要があったのですが、それを for文でアッサリと実現できてしまったので、サンプルソースを載せることにしました。
実際に試してもらいやすくするために、サンプルソースに入力フォームと入力チェックも付けました。
——————–
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
<?php // 祝日 $holiday = array ( '2014-01-01', '2014-01-02', '2014-01-03', '2014-01-13', '2014-02-11', '2014-03-21', '2014-04-29', '2014-05-05', '2014-05-06', '2014-07-21', '2014-09-15', '2014-09-23', '2014-10-13', '2014-11-03', '2014-11-24', '2014-12-23', '2014-12-31' ); if ( isset ( $_GET["mode"] ) ) { if ( $_GET["mode"] == "submit" ) { // 入力値の取得 $hiki_no = $_GET["no"]; $hiki_from = $_GET["from"]; $hiki_to = $_GET["to"]; // 変数の初期化 $err_msg = ""; $result = ""; // 入力チェック if ( !$hiki_no ) { $err_msg .= "No.が未入力です。<br />"; } else { if ( !preg_match ( "/^[0-9]{4}$/", $hiki_no ) ) { $err_msg .= "No.は半角数値 4桁で入力してください。<br />"; } } if ( !$hiki_from ) { $err_msg .= "日付(from)が未入力です。<br />"; } else { if ( !preg_match ( '/^([1-9][0-9]{3})\/(0[1-9]{1}|1[0-2]{1})\/(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1})$/', $hiki_from ) ) { $err_msg .= "日付(from)は 2014/01/01の形式で入力してください。<br />"; } } if ( !$hiki_to ) { $err_msg .= "日付(to)が未入力です。<br />"; } else { if ( !preg_match ( '/^([1-9][0-9]{3})\/(0[1-9]{1}|1[0-2]{1})\/(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1})$/', $hiki_to ) ) { $err_msg .= "日付(to)は 2014/01/01の形式で入力してください。<br />"; } } if ( $err_msg ) { $err_msg = "入力エラー<br />" . $err_msg; $err_encode = urlencode ( $err_msg ); header("Location: ./for_date.php?err_msg=$err_msg"); } // 以下の部分が日付ぐるぐる for ( $i = date ( "Y-m-d", strtotime ("$hiki_from") ); $i < date ( "Y-m-d", strtotime ("$hiki_to") ); $i = date ( "Y-m-d", strtotime ("$i +1day") ) ) { // 曜日フラグ初期化 $week_flg = ""; // w:数値で示す曜日(0:日 ~ 6:土) $week_now = date ( "w", strtotime($i) ); if ( $week_now == 0 ) { $week_flg = "日"; } elseif ( $week_now == 6 ) { $week_flg = "土"; } // 休日フラグ初期化 $holi_flg = ""; // 祝日フラグ取得 if ( in_array ( $i, $holiday ) ) { $holi_flg = "祝"; } $result .= "\n--------------\n"; $result .= $i . $week_flg . $holi_flg; } } } ?> <html><head> <title>日付ぐるぐる</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head><body> <h1>日付ぐるぐる</h1> <?php if ( isset ( $_GET["err_msg"] ) ) { echo "<strong>" . $_GET["err_msg"] . "</strong><br />"; } ?> <form action="" method="GET"> No.:<input type="text" name="no">数値 4桁で入力<br /> 日付(from):<input type="text" name="from">2014/03/31形式で入力<br /> 日付(to):<input type="text" name="to">2014/03/31形式で入力<br /> <input type="hidden" name="mode" value="submit"> <input type="submit" name="submit" value="保存"> </form> <textarea> <?php if ( isset ( $result ) ) { echo $result; } ?> </textarea> </body></html> |
——————–
上記のプログラムを実行すると、下記のような感じで日付の一覧が表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
-------------- 2014-01-01祝 -------------- 2014-01-02祝 -------------- 2014-01-03祝 -------------- 2014-01-04土 -------------- 2014-01-05日 -------------- 2014-01-06 -------------- 2014-01-07 -------------- 2014-01-08 -------------- 2014-01-09 |
ここでは単に日付を表示しているだけですが、実際に利用している処理としては、特定の日と特定の日の間の株価を更新するためのツールとして作りました。
データベースに入っている株価の情報ですが、株式分割などの影響で株価や売買数の調整をする場面が生じます。
そういう場面に使うツールとして、対応する日付と変更された株価の倍率などを指定して、1日 1行の UPDATE文を作成して実行していく、というツールです。
その UPDATE文を作る際に特定の日と特定の日の間の日付を取得する必要があったわけです。
土日、祝日の表示は必要なかったものですが、せっかく日付の管理をするならばと後から付けました。
実際に作ってみると意外に簡単だったんですが、for文の条件の中にも strtotimeが使えたことが新鮮な驚きがありました。
for文サンプルソースの解説
具体的には上記のソースです。
面白かったのは、49行目の for文のところです。
for文は、特定の開始の数値から、決められた数値を増やしていきながら、決められた条件になるまで処理を繰り返す、というものです。
そのため、増やしていく数値は「1」ずつ増やしていく必要はないわけですが、下記のように 1ずつ足していくものをよく記述します。
——————–
1 2 3 4 |
for ( $i = 0; $i < 100; $i++ ) { : : } |
——————–
だけど、今回は「1」ずつであっても「1日」ずつ増やしていくわけで、それはどうすればいいんだろう?とふと思ったことがきっかけです。
ただ、出来上がった for文の条件は、strtotimeで日付を UNIXタイムスタンプの数値に変換しているだけですので、
例えば、2014年01月01日~2014年01月20日の場合は、
strtotime(“2014-01-01”); となり、実際の値は「1388502000」になり、for文の中身は
——————–
1 |
for ( $i = 1388502000; $i < 1390143600; $i + 86400 ) { |
——————–
となっているだけなんですよね。
具体的に数値を当てはめてみると何の問題もないことが分かるわけですが、自分で記述しておきながら、ほほーと思った次第です。
もし、日付を for文でぐるぐる回しながら何かしらの処理を作る方の参考になれば幸いです。
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
QRコード作成ライブラリ「cakePHP-QR-Code-Helper」をPHPで使うカスタマイズ
CakePHP2用のQRコード作成ライブラリ「cakePHP-QR-Code-Helper」をプレーンのPHPでも使うためのカスタマイズ方法を解説。1ファイルを設置するだけでQRコードが作れるため使い勝手がいい。
-
-
cURLを利用する際の注意点「
&
」があるURLは「”
」で囲むcURLでURLはダブルクォーテーションで囲む。LinuxでもWindowsでもコマンドでは「&」は意味を持つ文字のためエラー原因になる。クォーテーションは常につけておく方が無難。
-
-
GMOペイメントゲートウェイのjava.io.IOExceptionのエラー
ECCUBEの決済でGMOペイメントゲートウェイのモジュールを使ってテスト決済を行った場合の不具合、java.io.IOExceptionと言うエラーの原因と対策方法の解説です。
-
-
路線・駅検索のために緯度経度からPHPで2点間の距離を計算する処理解説
路線・駅検索の仕組みの構築は大変。それを簡易に実装するために緯度経度を元に距離計算をする仕組みを考案。まずは2点間の距離を計算する仕組みを解説し、距離計算にまつわる関連技術も紹介。
-
-
XML形式の値を配列形式に変換・PHPでは simplexml_load_string()
XMLとは「Extensible Markup Language」の略でテキストベースのデータフォーマット。XMLをPHPで配列に変換するWebツールの紹介とその処理「simplexml_load_string()」関数についての解説。
-
-
数値文字参照コード変換ツール(HTML特殊文字コード変換ツール)
テキストを数値文字参照コード(特殊文字コード)に変換するツール。テキストを数値文字参照コードに簡単変換。数値文字参照、文字実体参照、特殊文字などの違いも解説。
-
-
路線・駅検索をPHPで実装する方法解説。GoogleMapsの緯度経度から計算し検索
路線・駅検索の仕組みの構築は大変。登録する側も最寄り駅が多い場合は大変。なので簡易に実装するため緯度経度に基づき直線距離を計算する処理を考案して実装して、その処理を解説。
-
-
PHP range関数を使って階乗と重複組み合わせを計算
PHPの range関数を使って階乗と重複組み合わせを計算し、それを元に乱数発生器を作成しました。
-
-
複数銘柄を指定して株価チャートを一覧するツール公開
入力銘柄の5日間、3か月間、6か月間、1年間、2年間の株価チャートを一覧表示しますのでチャートで売買判断をするのに最適です。
-
-
パーミッション(属性)一括変更ツール・WordPress最適化済
WordPressのパーミッション(属性)を一括変更するツールを作成!ファイル、フォルダのパーミッションが一覧表示でき、ファイルを選んでパーミッションの変更が行えます。