• 締切済み

PHP5でカレンダーを作っています。2日おきに日付にマーカーが入るようにするには?

教えてください。 PHP5でカレンダーを作っています。 2日おきにカレンダーの日付にマーカーが入るようにしたいのですがどうもうまくいきません。 どのようなスクリプトを書けばよいのでしょうか? わかる方教えてください。

みんなの回答

  • Suzi
  • ベストアンサー率38% (130/334)
回答No.7

7tv3mmさん,すみません。  「motokibさん」へとするところの名前を間違えてしまいました。  大変申し訳ありませんでした。

motokib
質問者

お礼

Suziさん、7tv3mmさんアドバイスありがとうございます。 お二方のアドバイスを参考に試行錯誤した結果、 無事、考えていたカレンダーができました。 ありがとうございました。 またわからないことがありましたらアドバイスお願いします(^-^)。

motokib
質問者

補足

Suziさん、7tv3mmさんアドバイスありがとうございます。 さっそくお二人のアドバイスを参考にさせていただきカレンダーを修正したいと思います。 お二人の意見を聞いて、まだまだ自分にはPHPの知識が足りないと痛感しました。 また後で結果を報告させていただきたいと思います。

  • 7tv3mm
  • ベストアンサー率75% (12/16)
回答No.6

Suzi さん、ご指摘ありがとうございます。 言葉足らずで誤解があるといけませんので、補足ですが、 私もタイムスタンプでの処理の方がいいと思ってます。 質問者さんの目的のカレンダーから逸れてしまって申し訳ないですが、 趣味で作った万年カレンダー(紀元前2000年~西暦3000年[万年でないです])や バイオリズムの計算(1990年生まれの人が60歳になった時 = 2050年 など)で、 1970年以前や2038年以後のタイムスタンプを取得できなかった時、 アバウトに日数計算で処理したのを思い出し、投稿した次第です。 なので、質問者さんにも、その程度という内容で受け取って下さい。

motokib
質問者

お礼

Suziさん、7tv3mmさんアドバイスありがとうございます。 お二方のアドバイスを参考に試行錯誤した結果、 無事、考えていたカレンダーができました。 ありがとうございました。 またわからないことがありましたらアドバイスお願いします(^-^)。

  • Suzi
  • ベストアンサー率38% (130/334)
回答No.5

7tv3mmさん、こんにちは。 >>+$kankaku days ⇒ +$kankaku_day  以下のところの変更だと思われますが、そうだとしたらこれは間違っています。 date( 'md', strtotime("+$kankaku days", $start_day) );  これは、タイムスタンプ($start_day) から ●×日語のタイムスタンプを作り出す物です。    つまり今日から3日後のタイムスタンプだとしたら、  date( 'md', strtotime("+3 days", 今日) ); になります。  +/-数字 days/weeks/montshs/years で指定します。  ロジックは、 1) 開始する日と間隔を決め、開始する日から換算したマーカー日を決め、これらはすべてタイムスタンプに。 2) ループの中でその日を出力しようとする時、   a:その日がマーカー日よりも以前でしたらマーカー日はそのまま   b:その日がマーカー日だったら、出力処理後、マーカー日を+間隔に変更 * その日付をマーカー日で比較する時は、月+日だけで一度タイムスタンプに出力した方が良いでしょう。  6月15日 14:23:02 と 6月15日 18:11:48 ではイコールにならないからです。月+日だけなら6月15日 00:00:00 になって統一できるからです。  こういう方法はより良いスマートなのも含めていろいろあると思います。

  • 7tv3mm
  • ベストアンサー率75% (12/16)
回答No.4

もう見ていないかもしれませんが、以前、万年カレンダーや バイオリズムの計算などの、タイムスタンプの範囲外も含めて 日数を計算した時、基軸となる年月日からの総日数で対応しました。 「2日おきにマーカー表示」という具合にアレンジすると、↓の感じです。 ttp://mfdl.hp.infoseek.co.jp/goo_php_q/20090606_php.txt (先頭のhは、外しています) $view_m の「表示したい年月」を変更して、2008年1月~同4月までは 確認しましたが、細かいところを端折っているので、それ以後の 年月でバグっているかもしれません。 タイムスタンプの範囲内だけなら、他の方が言われるように タイムスタンプで処理した方がスマートだと思います。

  • Suzi
  • ベストアンサー率38% (130/334)
回答No.3

補足への回答ありがとうございます。 「if($day % 3 == 1)」のところを以下のようにアレンジしてみるといかがでしょうか。 $m_num = $today[mon]; $d_num = $today[mday]; $year = $today[year]; $kankaku = '3'; # 日にちの間隔、 $kankaku += 1; $start_day = strtotime("$d_num $m_num $year "); # 開始する日 $marker_day = date( 'md', strtotime("+$kankaku days", $start_day) ); # マーカー日。0608とかに出力 ****ループ************** $this_tody = date( 'md', $today_2 ); # $today をタイムスタンプの$today_2に変換できることを願って if( $this_tody == $marker_day ){ print "マーカー処理"; $marker_day = date( 'md', strtotime("+$kankaku days", $today_2) ); } else print $today;

motokib
質問者

お礼

度々失礼します。 先ほどやってみましたが、すべての日付にマーカー(◎)が入ってしまいました。 以下のようにスクリプトを変更しました。 http://test.monki8.com/cal2_1.html 先ほどのアドバイスの関数に少し変更を加えました。 +$kankaku days ⇒ +$kankaku_day $this_tody ⇒ $this_today   ****ループ**************  ⇒ //****ループ************** print "マーカー処理"; ⇒ echo "<td align=\"center\"><a href=\"$PHP_SELF?$link\"><font size=\"3\" color=\"#0000cc\">$day</font></a><br>◎</td>\n"; print $today; ⇒  echo "<td align=\"center\"><a href=\"$PHP_SELF?$link\"><font size=\"3\" color=\"#0000cc\">$day</font></a></td>\n"; この変更が原因だったのでしょうか? ちなみにこのような結果になりました。 2009年6月 日  月  火  水  木  金  土    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 ◎  ◎  ※なぜか30日はマーカー(◎)なし

motokib
質問者

補足

ご回答ありがとうございます☆ さっそくやってみます。 結果は明日の夕方にまた報告させていただきます。 知識のない私にわかりやすく丁寧に教えてくださり嬉しいです。 感謝いたします。

  • Suzi
  • ベストアンサー率38% (130/334)
回答No.2

済みません、1ヶ月分のカレンダーだと思い込んでしまいました。 ループ付近のスクリプトをお知らせ願えますか。

motokib
質問者

補足

私の説明が足りず申し訳ございません。 よろしくお願いいたします。 このスクリプトですと、5月31日と6月1日にマーカー(◎)が 入ってしまうのです。(2日おきじゃない) 何か良い解決法がありましたらお教え願います。 http://test.monki8.com/cal2.html

  • Suzi
  • ベストアンサー率38% (130/334)
回答No.1

 2日おきだから任意に指定し初日から3日目にマーカーが入れば良いのだと思います。  以下のでどうでしょうか。 $start_day = '5'; # 開始する日 $kankaku = '3'; # 日にちの間隔 $marker_day = $start_day + $kankaku; # 最初にマーカーする日  日付をprintするループの中に(カレンダー日付が $today とするのなら)、 if( $today == $marker_day ){ print "マーカー処理"; $marker_day = $today + $kankaku; }else print $today;

motokib
質問者

お礼

回答ありがとうございます。 さっそく実行してみます。

motokib
質問者

補足

先ほど実行してみましたが、私の知識不足が原因でループ処理のところから先に進めません。 再度、質問失礼します。 以下の用なカレンダーにしたいのですが、助言をお願いします。 2日おきにマーカー(◎)が入るようにしたい。 2009年5月 日  月  火  水  木  金  土                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   2009年6月 日  月  火  水  木  金  土    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 ◎