質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

5031閲覧

今月と来月のカレンダーの処理をfor文で回すには

leoairen

総合スコア122

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/06/24 02:59

編集2016/06/24 04:56

初心者です。下記for文を書いてみたのですが、当月は出来ても翌月のはできませんでした。
どなたか教えて頂けますでしょうか。

$tsuki = '月'; $list =""; $list2 =""; for($i = 0; $m = date('n', strtotime(date('Y-m-1').' +'.$i.' month')), $m < 13 and $i < 2; $i++){ $list .= <<<EOF <h2>$m$tsuki</h2> <table cellspacing="0" summary="calendar"> <tr> <td>日</td> <td>月</td> <td>火</td> <td>水</td> <td>木</td> <td>金</td> <td>土</td> </tr> <tr> EOF; print $list; // 1日の曜日を取得 $wd1 = date("w", mktime(0, 0, 0, $m, 1, $y)); // その数だけ空のセルを作成 for ($i = 1; $i <= $wd1; $i++) { echo "<td> </td>"; } $d = 1; while (checkdate($m, $d, $y)) { // 日曜:赤色 if(date("w", mktime(0, 0, 0, $m, $d, $y)) == 0) { echo "<td class='sun'>$d</td>"; } // 祝日:赤色 else if(!empty($national_holiday[date("Y-m-d", mktime(0, 0, 0, $m, $d, $y))])) { echo "<td class='sun'>$d</td>"; } // 本日:シルバー else if ($d == date('j') && $y == date('Y') && $m == date('n')) { echo "<td class='today'>$d</td>"; } // 土日祝以外 else{ echo "<td class='date'>$d</td>"; } // 週の始まりと終わりでタグを出力 if (date("w", mktime(0, 0, 0, $m, $d, $y)) == 6) { // 週を終了 echo "</tr>"; // 次の週がある場合は新たな行を準備 if (checkdate($m, $d + 1, $y)) { echo "<tr>"; } } $d++; } // 最後の週の土曜日まで空のセルを作成 $wdx = date("w", mktime(0, 0, 0, $m + 1, 0, $y)); for ($i = 1; $i < 7 - $wdx; $i++) { echo "<td> </td>"; } $list2 .= <<<EOF </tr> </table> EOF; print $list2; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2016/06/24 03:03

コードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「</>」ボタンを押すとコードブロックになります。
leoairen

2016/06/24 03:32

ご指摘、ありがとうございます。修正いたしました。よろしくお願いいたします。
tanat

2016/06/24 04:40

最終的に作りたいのは 当月と翌日を同時に表示したいのか 何らかの入力によって翌月だけ表示したいのか 1年分丸ごと表示したいのか どれが一番近いですか?
leoairen

2016/06/24 04:44

コメントありがとうございます。当月と翌日を同時に表示したいです。テーブルで組んだカレンダーが二つあるということになります。
leoairen

2016/06/24 04:59 編集

質問にあるコードを修正しました。
guest

回答4

0

ベストアンサー

1月~12月までを出力したいだけなら、単純な処理で良いのでは。
for文のところのみ書き換え。

PHP

1for($m = 1; $m <= 12; $m++){

余談ですが、for文の中には書こうと思えば色々書けますが、わかりづらいコードになるのでお勧めしません。


訂正版

PHP

1<?php 2$tsuki = '月'; 3$list =""; 4$list2 =""; 5$dd = mktime(); 6for( $j = 0; $j < 2; $j++ ){ 7 $m = date("n",$dd); 8 $dd = strtotime( date("Y/m/d",$dd) . " 1 month"); 9 $list = <<<EOF 10<h2>$m$tsuki</h2> 11<table cellspacing="0" summary="calendar"> 12<tr> 13<td>日</td> 14<td>月</td> 15<td>火</td> 16<td>水</td> 17<td>木</td> 18<td>金</td> 19<td>土</td> 20</tr> 21<tr> 22EOF; 23 print $list; 24 25 // 1日の曜日を取得 26 $wd1 = date("w", mktime(0, 0, 0, $m, 1, $y)); 27 28 // その数だけ空のセルを作成 29 for ($i = 1; $i <= $wd1; $i++) { 30 echo "<td> </td>"; 31 } 32 $d = 1; 33 34 while (checkdate($m, $d, $y)) { 35 36 // 日曜:赤色 37 if(date("w", mktime(0, 0, 0, $m, $d, $y)) == 0) 38 { 39 echo "<td class='sun'>$d</td>"; 40 } 41 // 祝日:赤色 42 else if(!empty($national_holiday[date("Y-m-d", mktime(0, 0, 0, $m, $d, $y))])) 43 { 44 echo "<td class='sun'>$d</td>"; 45 } 46 // 本日:シルバー 47 else if ($d == date('j') && $y == date('Y') && $m == date('n')) 48 { 49 echo "<td class='today'>$d</td>"; 50 } 51 // 土日祝以外 52 else{ 53 echo "<td class='date'>$d</td>"; 54 } 55 56 // 週の始まりと終わりでタグを出力 57 if (date("w", mktime(0, 0, 0, $m, $d, $y)) == 6) 58 { 59 // 週を終了 60 echo "</tr>"; 61 62 // 次の週がある場合は新たな行を準備 63 if (checkdate($m, $d + 1, $y)) { 64 echo "<tr>"; 65 } 66 } 67 68 $d++; 69 } 70 71 // 最後の週の土曜日まで空のセルを作成 72 $wdx = date("w", mktime(0, 0, 0, $m + 1, 0, $y)); 73 74 for ($i = 1; $i < 7 - $wdx; $i++) 75 { 76 echo "<td> </td>"; 77 } 78 79 $list2 .= <<<EOF 80</tr> 81</table> 82EOF; 83 print $list2; 84} 85?>

http://ideone.com/jlNIJP

投稿2016/06/24 04:59

編集2016/06/24 06:01
ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

leoairen

2016/06/24 05:00

ご回答ありがとうございます。今月と翌月を表示させたいです。
ttyp03

2016/06/24 05:04

じゃあこんな感じでしょうか。 $mm = date("n"); for($m = $mm; $m <= $mm + 1; $m++){
ttyp03

2016/06/24 05:24

あ、これだと年跨ぎがダメですね。
ttyp03

2016/06/24 05:28

一応訂正版。 $dd = mktime(); for( $i = 0; $i < 2; $i++ ){ $m = date("n",$dd); $dd = strtotime( date("Y/m/d",$dd) . " 1 month");
leoairen

2016/06/24 05:33

ご回答ありがとうございます。では年跨ぎはどう書けばよろしいでしょうか。 それと、現状では下記のようになっていますので、教えて頂けたら幸いです。 <h2>6月</h2> <table> <tr> <td>日</td> <td>月</td> <td>火</td> <td>水</td> <td>木</td> <td>金</td> <td>土</td> </tr> <h2>6月</h2> <table> <tr> <td>日</td> <td>月</td> <td>火</td> <td>水</td> <td>木</td> <td>金</td> <td>土</td> </tr> <tr> <h2>7月</h2> <table> <tr> <td>日</td> <td>月</td> <td>火</td> <td>水</td> <td>木</td> <td>金</td> <td>土</td> </tr> </table>
leoairen

2016/06/24 05:35 編集

追記ですが、訂正版ですと、今月のみになります。
ttyp03

2016/06/24 05:35

年跨ぎについては回答済みです。 確認お願いします。
leoairen

2016/06/24 05:46

ご回答、ありがとうございます。確認致しました。確かに書いていただいたコードは今月と翌月を表示させられますが、質問の中に自分が書いている日付処理の部分までfor文で囲むと今月のみになってしまいます。この場合、どのように修正すればよろしいでしょうか。
ttyp03

2016/06/24 05:59

$iをループの中でも使っているから、値がおかしくなっているのでしょう。 あと$listを.=で連結させた結果を出力していたので、二重に出力もされていました。 訂正版をトップに置いておきます。
leoairen

2016/06/24 06:27

ご回答、ありがとうございました。 できました。 もし可能であれば、修正箇所を解説して頂けたら大変ありがたいのですが、 $ddがある部分は年跨ぎのための記述かと思いますが、最初に「$dd = mktime();」と設定して、そしてそれを引数にすることはどういう理由でしょうか。
ttyp03

2016/06/24 06:32

コメントを入れてみましたが、わかりますでしょうか。 // 現在日時のタイムスタンプを取得。このタイムスタンプをひと月ずつずらしていく。 $dd = mktime(); // 2か月分のループ for( $j = 0; $j < 2; $j++ ){  // $ddから月を取得  $m = date("n",$dd);  // $ddの翌月のタイムスタンプを取得して、$ddに詰め直す  $dd = strtotime( date("Y/m/d",$dd) . " 1 month");
leoairen

2016/06/24 06:42

早速のご解説、ありがとうございました。とてもわかりやすかったです。本当にありがとうございました。
guest

0

もしかしてカレンダー自体も書かせたかった?

<?PHP $tsuki = '月'; $list =""; for($i = 0; $i < 12; $i++){ $d = mktime(0,0,0,date("m")+$i,1,date("Y")); $m = date("n",$d); $list .= <<<EOF <h2>$m$tsuki</h2> <table> <tr> <td>日</td> <td>月</td> <td>火</td> <td>水</td> <td>木</td> <td>金</td> <td>土</td> </tr> EOF; for($j=0;$j<6;$j++){ $list .="<tr>"; for($k=0;$k<7;$k++){ $num=$j*7+$k; $w=date("w",$d); $list .="<td>"; if(date("n",$d+($num-$w)*86400)!=$m ){ $list .="x"; }else{ $list .=($num-$w+1); } $list .="</td>"; } $list .="</tr>"; } $list.="</tr></table>"; } print $list;

日付が存在しない週を表示したくないならもう一工夫必要

投稿2016/06/24 04:50

yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

leoairen

2016/06/24 04:58 編集

はい、カレンダーも書かせたいです。質問にあるコードを修正しました。
leoairen

2016/06/24 06:42

ttyp03さんの回答でできました。ありがとうございました。
guest

0

mktime()したほうが楽かも

<?PHP $tsuki = '月'; $list =""; for($i = 0; $i < 12; $i++){ $m = date("n",mktime(0,0,0,date("m")+$i,1,date("Y"))); $list .= <<<EOF <h2>$m$tsuki</h2> <table> <tr> <td>日</td> <td>月</td> <td>火</td> <td>水</td> <td>木</td> <td>金</td> <td>土</td> </tr> </table> EOF; } print $list;

投稿2016/06/24 03:18

yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

leoairen

2016/06/24 04:21

ご回答、ありがとうございます。試しましたが翌月はできませんでした。
leoairen

2016/06/24 06:43

ttyp03さんの回答でできました。ありがとうございました。
guest

0

これだと、$mへ入る値が、ループ先頭でしか実行されません。

php

1for($i = 0 ; $m = date('n', strtotime(date('Y-m-1').' +'.$i.' month')), $m < 13 and $i < 2; $i++){

で、ループ事に $mが変わります。

投稿2016/06/24 03:17

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

leoairen

2016/06/24 04:21

ご回答、ありがとうございます。試しましたが翌月はできませんでした。
退会済みユーザー

退会済みユーザー

2016/06/24 05:22

$mが変だったので、とりあえず修正してみたのですが、そもそもこの部分だけ直してもダメですね。12月の次が、今年の1月になっちゃいますね
leoairen

2016/06/24 06:29

コメント、ありがとうございます。ttyp03さんの回答でできました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問