PHPで簡単なカレンダーを作成しようと思っています。やりたいことは下のようなカレンダーを作成したいです。forループで表自体は作れるのですが、最後の行に何もデータ(日付)が入っていない場合は最後の行は表示しないという処理にしたいです。この場合、31より後ろの4つのセルはあっても問題ありません。あくまで、最後の行が空の場合は最後の行は表示しない、もしくは表示させないという処理です。


これだとforループで表を作るには難しいような気がしますが、何かよいアイディアをご教授ください。


┏━━━━━━━━━━━━━┓
┃********2006年10月********┃
┣━┳━┳━┳━┳━┳━┳━┫
┃Su┃Mo┃Tu┃We┃Th┃Fr┃Sa┃
┣━╋━╋━╋━╋━╋━╋━┫
┃01┃02┃03┃04┃05┃06┃07┃
┣━╋━╋━╋━╋━╋━╋━┫
┃08┃09┃10┃11┃12┃13┃14┃
┣━╋━╋━╋━╋━╋━╋━┫
┃15┃16┃17┃18┃19┃20┃21┃
┣━╋━╋━╋━╋━╋━╋━┫
┃22┃23┃24┃25┃26┃27┃28┃
┣━╋━╋━╋━╋━╋━╋━┫
┃29┃30┃31┃--┃--┃--┃--┃
┣━╋━╋━╋━╋━╋━╋━┫
┃--┃--┃--┃--┃--┃--┃--┃
┗━┻━┻━┻━┻━┻━┻━┛

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2006/11/20 15:08:22
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Mook No.5

回答回数1314ベストアンサー獲得回数393

ポイント40pt

ito_u さんで基本は良いと思いますが、カレンダーの内容が

誤っていたのと、最終日が土曜だと空白週が表示されていたので、

それらを訂正し、カレンダー表示を関数化してみました。

<html>
<head>
<title>PHPカレンダサンプル</title>
<?php

function drawCalender( $y ,$m ) {
    $t = mktime(0, 0, 0, $m, 1, $y); //$y年$m月1日のUNIXTIME
    $w = date('w', $t); //1日の曜日(0:日~6:土)
    $n = date('t', $t); //$y年$m月の日数
    print '<table border="1" bgcolor="FFFFFF">'."\n";
    print "<caption><font color=\"#0000FF\"><b>{$y}年{$m}月</font></b></caption>\n";
    print <<<DAY_TITLE
    <tr>
        <th>日</th>
        <th>月</th>
        <th>火</th>
        <th>水</th>
        <th>木</th>
        <th>金</th>
        <th>土</th>
    </tr>
    <tr>
DAY_TITLE;
    for( $i = 1 - $w ; $i <= $n + 7 ; $i++ ){
        if ( ( ( $i + $w ) % 7 ) == 1 ) {
            print "<tr>\n";
        }
        if ( ( 0 < $i ) &amp;&amp; ( $i <= $n ) ) {
            print "<td align=\"center\">$i</td>\n";
        } else {
            print "<td>&nbsp;</td>\n";
        }
        if ( ( ( $i + $w ) % 7 ) == 0 ) {
            print "</tr>\n";
            if ( $i >= $n ) {
                break;
            }
        }
    }
    print "</table>\n";
}
?>
</head>
<body bgcolor="#E0F0E0">
    <center>
    <table width = "80%">
    <?php
    $yy = 2006;
    for ( $i=1 ; $i<=12 ; $i++ ) {
        if ( ( $i % 3 ) == 1 ) {
            print "<tr>\n";
        }
        print "<td>\n";
        drawCalender($yy,$i);
        print "</td>\n";
        if ( ( $i % 3 ) == 0 ) {
            print "</tr>\n";
        }
    }
    ?>
    </table>
    </center>
</body>
</html>

記法の関係で &

&amp;

になっているので、置換して実行してみてください。

1年分のカレンダーを表示するサンプルです。

id:popattack

ここまで親切にご回答していただき恐れ入ります。ありがとうございます!!

2006/11/18 17:21:38

その他の回答4件)

id:llusall No.1

回答回数505ベストアンサー獲得回数61

こちら、いかがでしょうか?


カレンダー作成(クラス)

http://aki.adam.ne.jp/php/calendar/download.php

デモ

http://aki.adam.ne.jp/php/samples/calendar/calendardemo.php

id:popattack

このデモはよいのですが、詳細な最後の行が空なら最後の行は表示しないというような具体的な方法が知りたいです。

2006/11/18 11:49:35
id:ito-yu No.2

回答回数323ベストアンサー獲得回数14

ポイント20pt
<?php

$y = 2006; //年
$m = 10;   //月

$t = mktime(0, 0, 0, $m, 1, $y); //$y年$m月1日のUNIXTIME

$w = date('w', $t); //1日の曜日(0:日~6:土)
$n = date('t', $t); //$y年$m月の日数

?>
<table border="1">
<caption><?php echo $y.'年'.$m.'月'; ?></caption>
<tr>
	<th>日</th>
	<th>月</th>
	<th>火</th>
	<th>粋</th>
	<th>木</th>
	<th>金</th>
	<th>土</th>
</tr>
<?php
$end = false; //表示完了フラグ
for($r = 0; $r < 6; $r ++){ //最大6週まで
?>
<tr>
<?php
	for($i = 0; $i < 7; $i ++){ //日~土ループ
		$d = $r * 7 + $i - $w; //今表示しようとしている日、マイナスや32以上もあり得る
		$v = '&nbsp;'; //実際表示する文字列
		if($d > $n){ //月最終日以降なら表示完了フラグをたてる
			$end = true;
		}elseif($d > 0){ //0より大きければ
			$v = sprintf("%02d", $d); //2桁にフォーマット
		}
?>
	<td><?php echo $v; ?></td>
<?php
	}
?>
</tr>
<?php
	if($end){ //表示完了していれば抜ける
		break;
	}
}
?>
</table>

id:popattack

ここまで親切にご回答していただき恐れ入ります。ありがとうございます!!

2006/11/18 17:21:44
id:ito-yu No.3

回答回数323ベストアンサー獲得回数14

ポイント20pt

週の開始曜日を変えられるバージョン

<?php

$jw = array( '日', '月', '火', '水', '木', '禁', '土', ); //曜日配列

$y = 2006; //年
$m = 10;   //月

$t = mktime(0, 0, 0, $m, 1, $y); //$y年$m月1日のUNIXTIME

$w = date('w', $t); //1日の曜日(0:日~6:土)
$n = date('t', $t); //$y年$m月の日数

$s = 1; //週を開始したい曜日(0:日~6:土)※1は月曜スタート
$p = ($w + 1 < $s) ? -1 : 0; //1日の曜日より週の開始曜日が先の場合の補正

?>
<table border="1">
<caption><?php echo $y.'年'.$m.'月'; ?></caption>
<tr>
<?php
for($i = 0; $i < 7; $i ++){ //曜日ヘッダ表示
	$d = ($i + $s) % 7; //曜日の添字に変換
?>
	<th><?php echo $jw[$d]; ?></th>
<?php
}
?>
</tr>
<?php
$end = false; //表示完了フラグ
for($r = 0; $r < 6; $r ++){ //最大6週まで
?>
<tr>
<?php
	for($i = 0; $i < 7; $i ++){ //日~土ループ
		$d = ($r + $p) * 7 + $i + $s - $w; //今表示しようとしている日、マイナスや32以上もあり得る
		$v = '&nbsp;'; //実際表示する文字列
		if($d > $n){ //月最終日以降なら表示完了フラグをたてる
			$end = true;
		}elseif($d > 0){ //0より大きければ
			$v = sprintf("%02d", $d); //2桁にフォーマット
		}
?>
	<td><?php echo $v; ?></td>
<?php
	}
?>
</tr>
<?php
	if($end){ //表示完了していれば抜ける
		break;
	}
}
?>
</table>
id:popattack

こんなに長いコードを書いて頂いてありがとうございます。これでなんとか実現できそうです。ありがとうございました!!大変感謝です!

2006/11/18 12:11:05
id:ktoshi No.4

回答回数107ベストアンサー獲得回数6

ポイント20pt

こんな感じではどうでしょうか?

$startweek = date("w",mktime(0,0,0,10,1,2006));
$lastday = date("d",mktime(0,0,0,11,0,2006));

$a = $startweek + $lastday; // 1日の週の開始日+最終日
$b = $a + (7 - ( $a % 7 )); // $a + 最終日からの週の余り(その月の必要マスを決めてます。
$day = 1;  // 日にち

print '<table border="1">';
for($i=0; $i<$b; $i++){
    
    if($i<$startweek){
       $days_str .= '<td>a</td>';
    }else if($day>$lastday){
       $days_str .= '<td>a</td>';
    }else{
       $days_str .= '<td>'.$day.'</td>';
       $day++;
    }
    
    if($i%7==6){
	print '<tr>'.$days_str.'</tr>';
        $days_str='';
    }

}
print '<table>';

id:popattack

ここまで親切にご回答していただき恐れ入ります。ありがとうございます!!

2006/11/18 17:21:55
id:Mook No.5

回答回数1314ベストアンサー獲得回数393ここでベストアンサー

ポイント40pt

ito_u さんで基本は良いと思いますが、カレンダーの内容が

誤っていたのと、最終日が土曜だと空白週が表示されていたので、

それらを訂正し、カレンダー表示を関数化してみました。

<html>
<head>
<title>PHPカレンダサンプル</title>
<?php

function drawCalender( $y ,$m ) {
    $t = mktime(0, 0, 0, $m, 1, $y); //$y年$m月1日のUNIXTIME
    $w = date('w', $t); //1日の曜日(0:日~6:土)
    $n = date('t', $t); //$y年$m月の日数
    print '<table border="1" bgcolor="FFFFFF">'."\n";
    print "<caption><font color=\"#0000FF\"><b>{$y}年{$m}月</font></b></caption>\n";
    print <<<DAY_TITLE
    <tr>
        <th>日</th>
        <th>月</th>
        <th>火</th>
        <th>水</th>
        <th>木</th>
        <th>金</th>
        <th>土</th>
    </tr>
    <tr>
DAY_TITLE;
    for( $i = 1 - $w ; $i <= $n + 7 ; $i++ ){
        if ( ( ( $i + $w ) % 7 ) == 1 ) {
            print "<tr>\n";
        }
        if ( ( 0 < $i ) &amp;&amp; ( $i <= $n ) ) {
            print "<td align=\"center\">$i</td>\n";
        } else {
            print "<td>&nbsp;</td>\n";
        }
        if ( ( ( $i + $w ) % 7 ) == 0 ) {
            print "</tr>\n";
            if ( $i >= $n ) {
                break;
            }
        }
    }
    print "</table>\n";
}
?>
</head>
<body bgcolor="#E0F0E0">
    <center>
    <table width = "80%">
    <?php
    $yy = 2006;
    for ( $i=1 ; $i<=12 ; $i++ ) {
        if ( ( $i % 3 ) == 1 ) {
            print "<tr>\n";
        }
        print "<td>\n";
        drawCalender($yy,$i);
        print "</td>\n";
        if ( ( $i % 3 ) == 0 ) {
            print "</tr>\n";
        }
    }
    ?>
    </table>
    </center>
</body>
</html>

記法の関係で &

&amp;

になっているので、置換して実行してみてください。

1年分のカレンダーを表示するサンプルです。

id:popattack

ここまで親切にご回答していただき恐れ入ります。ありがとうございます!!

2006/11/18 17:21:38

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません