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

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

ただいまの
回答率

90.36%

  • PHP

    22498questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,812

leoairen

score 66

初心者です。下記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;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tanat

    2016/06/24 13:40

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

    キャンセル

  • leoairen

    2016/06/24 13:44

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

    キャンセル

  • leoairen

    2016/06/24 13:57 編集

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

    キャンセル

回答 4

checkベストアンサー

0

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

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


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


訂正版

<?php
$tsuki = '月';
$list ="";
$list2 ="";
$dd = mktime();
for( $j = 0; $j < 2; $j++ ){
    $m = date("n",$dd);
    $dd = strtotime( date("Y/m/d",$dd) . " 1 month");
    $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;
}
?>


http://ideone.com/jlNIJP

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/24 14:00

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

    キャンセル

  • 2016/06/24 14:04

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

    キャンセル

  • 2016/06/24 14:24

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

    キャンセル

  • 2016/06/24 14:28

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

    キャンセル

  • 2016/06/24 14: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>

    キャンセル

  • 2016/06/24 14:35 編集

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

    キャンセル

  • 2016/06/24 14:35

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

    キャンセル

  • 2016/06/24 14:37

    一応動作は確認済みです。
    http://ideone.com/ZmRskX

    キャンセル

  • 2016/06/24 14:46

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

    キャンセル

  • 2016/06/24 14:59

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

    キャンセル

  • 2016/06/24 15:27

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

    キャンセル

  • 2016/06/24 15: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");

    キャンセル

  • 2016/06/24 15:42

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

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/24 13:21

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

    キャンセル

  • 2016/06/24 14:22

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

    キャンセル

  • 2016/06/24 15:29

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

    キャンセル

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 13:21

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

    キャンセル

  • 2016/06/24 15:43

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

    キャンセル

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 13:58 編集

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

    キャンセル

  • 2016/06/24 15:42

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

    キャンセル

同じタグがついた質問を見る

  • PHP

    22498questions

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