- ベストアンサー
phpプログラムについて
いつもお世話になっております。 カレンダー一覧表示プログラムがあります。 http://lab.crahadoll.net/samples/script_euc/chapter15/15-5/031831.php プログラムは下記になります。 http://lab.crahadoll.net/samples/script_euc/chapter15/15-5/031831.txt すみませんが、共に文字コードを「EUC」に変更してください。 これは、チェックボックスから年・月を選択し、 「月表示」をクリックすることにより 月一覧が表示されるというプログラムです。 2012▼ 01▼ [月表示] 日付 2012/01/01 2012/01/02 2012/01/03 2012/01/04 (省略) 2012/01/31 これを下記のように、 週表示にし1時間30分置きの表示を考えております。 2012▼ 01▼ 01▼ [週表示] 日付 2012/01/01 00:00 01:30 03:00 (省略) 21:00 22:30 2012/01/02 00:00 01:30 (省略) 22:20 2012/01/03 (省略) 2012/01/06 どのような変更を加えれば、 当問題はクリアーできますでしょうか? なにとぞご教授のほどよろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 週から日を取得するやつを前に作った事があります。 //############################################################ // 月初曜日取得関数 // 概要 指定年月の月初曜日を取得する // 引数 $Date : 日付(yyyy-mm-dd) // 戻り値 0:日曜 1:月曜 ・・・ 5:金曜 6:土曜 //############################################################ Function Get_FirstWeekday($Date) { $Date = Date("Y-m", StrToTime($Date))."-01"; $Week = Date("w", StrToTime($Date)); Return $Week; } //############################################################ // 月末日取得関数 // 概要 指定年月の月末日を取得する // 引数 $Date : 日付(yyyy-mm-dd) // 戻り値 月末日 //############################################################ Function Get_LastDay($Date) { $Year = Date("Y", StrToTime($Date)); $Month = Date("m", StrToTime($Date)); Switch ($Month) { Case 1: Case 3: Case 5: Case 7: Case 8: Case 10: Case 12: $LastDay = 31; Break; Case 4: Case 6: Case 9: Case 11: $LastDay = 30; Break; Case 2: If (($Year % 4 == 0 And $Year % 100 <> 0) Or $Year % 400 == 0) { $LastDay = 29; } Else { $LastDay = 28; } } Return $LastDay; } //############################################################ // 指定日取得関数 // 概要 指定年月、N週、N曜日の日を取得する // 引数 $Year : 年 // $Month : 月 // $WeekNum : N週 // $Weekday : N曜日(SUN,MON,TUE,WED,THU,FRI,SAT) // 戻り値 日 //############################################################ //指定された曜日の日を取得 Function Get_Week2Day($Year, $Month, $WeekNum, $Weekday) { //曜日に合ったインデックスを取得 Switch (StrToUpper($Weekday)) { Case "SUN":Case 0: $Weekday = 0; Break; Case "MON":Case 1: $Weekday = 1; Break; Case "TUE":Case 2: $Weekday = 2; Break; Case "WED":Case 3: $Weekday = 3; Break; Case "THU":Case 4: $Weekday = 4; Break; Case "FRI":Case 5: $Weekday = 5; Break; Case "SAT":Case 6: $Weekday = 6; Break; } //月初の曜日 $FirstWeekday =Get_FirstWeekday($Year."-".$Month."-01"); //指定曜日が月初曜日より手前の場合 If ($Weekday < $FirstWeekday) { $Day = (($WeekNum - 1) * 7) + ($Weekday + 1) + (7 - $FirstWeekday); //指定曜日が月初曜日以降の場合 } Else { $Day = (($WeekNum - 1) * 7) + $Weekday - ($FirstWeekday - 1); } Return $Day; } ご参考までに。月末日を取得するやつも必要ですね。 必ず7日間ループすわけではないので。
その他の回答 (4)
- taketan_mydns_jp
- ベストアンサー率58% (450/773)
ちょっと気になったので。 #4さんの関数の中に StrToTime() というのがありますが、これはこんな感じですよね。 function StrToTime($date){ list($Y,$m,$d) = sscanf($date, "%d-%d-%d"); $time = mktime(0,0,0,$m,$d,$Y); return $time; } ところで、Get_LastDayはdate関数もっとスマートになります。 function Get_LastDay($date){ $lastdate = date("t",StrToTime($date)); return $lastdate; } > naktak様へ すみません、横やり入れまして。ちょっと気になったもので。。。
補足
お世話になっております。 皆様のご意見により、 下記のようなスクリプトの形となりました。 が、なぜかif/elseの条件がperse_errorによりなりたちません。 if/ifはうまくいきますが、 if/elseがうまくいかないのです。 どこがいけないのでしょうか? また、下記スクリプトにて 「ここは変更した方がよい」 という箇所等ございましたら、 あわせてご教授頂きたいと思います。 よろしくお願いします。 <table border="1"> <tr bgcolor="#ffd700"> <td>日付</td> </tr> <?php $yyyy = 2006; $mm = 8; $ww = 2; $wd1 = date("w", mktime(0, 0, 0, $mm, 1, $yyyy)); echo "<p>wd1 ".$wd1; $wd1 = date("w", mktime(0, 0, 0, $mm, 1, $yyyy)); $wd2 = 7 * $ww - $wd1; echo "<p>wd2 ".$wd2; $d = 0; $lastd = date("d", mktime(0, 0, 0, $mm + 1, 0, $yyyy)); echo "<p>lastd ".$lastd; if ($ww == 1) { for ($i = 1; $i <= $wd2; $i++) { ?> <tr> <?php $ts = mktime($hh, $u, 0, $mm, $i, $yyyy); $ymd = date("Y/m/d H:i", $ts); ?> <td><?= $ymd ?></td> <?php } ?> <?php } ?> <?php if ($ww == 2) //else { for ($i = $wd2 + 1; $i <= min($wd2 + 7,$lastd); $i++) { ?> <tr> <?php $ts = mktime($hh, $u, 0, $mm, $i, $yyyy); $ymd = date("Y/m/d H:i", $ts); ?> <td><?= $ymd ?></td> <?php } ?> <?php } ?> </table>
- salf
- ベストアンサー率42% (27/64)
1時間30分おきの表示は普通にできますよね? それで、週表示ですが、 1.選択されている月の日数を取得 2.選択された年月の1日の曜日を取得 3.その二つを使用して何週あるかを取得 4.コンボボックスに表示 という流れになると思います。 年月日関係は全部 date() コマンドで取得できるはずですのでがんばって!!!
お礼
補足の件ですが、 下記の通りできましたので、 難問に取り掛かりたいと思います。 <?php $lastd = date("d", mktime(0, 0, 0, $mm + 1, 0, $yyyy)); for ($i = 1; $i <= $lastd; $i++) for ($u = 0; $u <= 1439; $u+=90) { ?> <tr> <?php $ts = mktime($hh, $u, 0, $mm, $i, $yyyy); $ymd = date("Y/m/d H:i", $ts); ?> <td><?= $ymd ?></td> <?php } ?>
補足
>1時間30分おきの表示は普通にできますよね? すみません。 第一段階から理解できておりません。 90分(1時間30)で回して、 月末に処理を停止するスクリプトを作成しましたが、 最初の1:30は正常に出力されるのですが、 その後、1:30 1:31 1:32となってしまいます。 また、月末までループ処理させたいのですが、 この処理が正常にいけば、月末で止まりますか? よろしくお願いします。 <?php $lastd = date("Y 年 m 月 h時 i分", mktime(0, 0, 0, $mm, 1, $yyyy)); for ($u = 90; $u <= $lastd; $u++) { ?> <tr> <?php $ts = mktime($hh, $u, 0, $mm, 1, $yyyy); $ymd = date("Y/m/d H:i", $ts); ?> <td><?= $ymd ?></td> <?php } ?>
- Ikonos00
- ベストアンサー率28% (86/302)
指定した年月日の週初の日付を求める。 これさえクリアすれば後は問題と言うほどのものではないかと思います。
補足
お世話になっております。 皆様のご意見により、 下記のようなスクリプトの形となりました。 が、なぜかif/elseの条件がperse_errorによりなりたちません。 if/ifはうまくいきますが、 if/elseがうまくいかないのです。 どこがいけないのでしょうか? また、下記スクリプトにて 「ここは変更した方がよい」 という箇所等ございましたら、 あわせてご教授頂きたいと思います。 よろしくお願いします。 <table border="1"> <tr bgcolor="#ffd700"> <td>日付</td> </tr> <?php $yyyy = 2006; $mm = 8; $ww = 2; $wd1 = date("w", mktime(0, 0, 0, $mm, 1, $yyyy)); echo "<p>wd1 ".$wd1; $wd1 = date("w", mktime(0, 0, 0, $mm, 1, $yyyy)); $wd2 = 7 * $ww - $wd1; echo "<p>wd2 ".$wd2; $d = 0; $lastd = date("d", mktime(0, 0, 0, $mm + 1, 0, $yyyy)); echo "<p>lastd ".$lastd; if ($ww == 1) { for ($i = 1; $i <= $wd2; $i++) { ?> <tr> <?php $ts = mktime($hh, $u, 0, $mm, $i, $yyyy); $ymd = date("Y/m/d H:i", $ts); ?> <td><?= $ymd ?></td> <?php } ?> <?php } ?> <?php if ($ww == 2) //else { for ($i = $wd2 + 1; $i <= min($wd2 + 7,$lastd); $i++) { ?> <tr> <?php $ts = mktime($hh, $u, 0, $mm, $i, $yyyy); $ymd = date("Y/m/d H:i", $ts); ?> <td><?= $ymd ?></td> <?php } ?> <?php } ?> </table>
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
・週コンボを追加 ・指定年月週は何日か取得(日曜日を週初?) ・0:00~22:30の出力 やりたい事が分かればプログラムを書けるハズ。
補足
お世話になっております。 皆様のご意見により、 下記のようなスクリプトの形となりました。 が、なぜかif/elseの条件がperse_errorによりなりたちません。 if/ifはうまくいきますが、 if/elseがうまくいかないのです。 どこがいけないのでしょうか? また、下記スクリプトにて 「ここは変更した方がよい」 という箇所等ございましたら、 あわせてご教授頂きたいと思います。 よろしくお願いします。 <table border="1"> <tr bgcolor="#ffd700"> <td>日付</td> </tr> <?php $yyyy = 2006; $mm = 8; $ww = 2; $wd1 = date("w", mktime(0, 0, 0, $mm, 1, $yyyy)); echo "<p>wd1 ".$wd1; $wd1 = date("w", mktime(0, 0, 0, $mm, 1, $yyyy)); $wd2 = 7 * $ww - $wd1; echo "<p>wd2 ".$wd2; $d = 0; $lastd = date("d", mktime(0, 0, 0, $mm + 1, 0, $yyyy)); echo "<p>lastd ".$lastd; if ($ww == 1) { for ($i = 1; $i <= $wd2; $i++) { ?> <tr> <?php $ts = mktime($hh, $u, 0, $mm, $i, $yyyy); $ymd = date("Y/m/d H:i", $ts); ?> <td><?= $ymd ?></td> <?php } ?> <?php } ?> <?php if ($ww == 2) //else { for ($i = $wd2 + 1; $i <= min($wd2 + 7,$lastd); $i++) { ?> <tr> <?php $ts = mktime($hh, $u, 0, $mm, $i, $yyyy); $ymd = date("Y/m/d H:i", $ts); ?> <td><?= $ymd ?></td> <?php } ?> <?php } ?> </table>