これだと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┃--┃--┃--┃--┃
┣━╋━╋━╋━╋━╋━╋━┫
┃--┃--┃--┃--┃--┃--┃--┃
┗━┻━┻━┻━┻━┻━┻━┛
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 ) && ( $i <= $n ) ) { print "<td align=\"center\">$i</td>\n"; } else { print "<td> </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>
記法の関係で & が
&
になっているので、置換して実行してみてください。
1年分のカレンダーを表示するサンプルです。
こちら、いかがでしょうか?
カレンダー作成(クラス)
http://aki.adam.ne.jp/php/calendar/download.php
デモ
このデモはよいのですが、詳細な最後の行が空なら最後の行は表示しないというような具体的な方法が知りたいです。
<?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 = ' '; //実際表示する文字列 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>
ここまで親切にご回答していただき恐れ入ります。ありがとうございます!!
週の開始曜日を変えられるバージョン
<?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 = ' '; //実際表示する文字列 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>
こんなに長いコードを書いて頂いてありがとうございます。これでなんとか実現できそうです。ありがとうございました!!大変感謝です!
こんな感じではどうでしょうか?
$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>';
ここまで親切にご回答していただき恐れ入ります。ありがとうございます!!
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 ) && ( $i <= $n ) ) { print "<td align=\"center\">$i</td>\n"; } else { print "<td> </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>
記法の関係で & が
&
になっているので、置換して実行してみてください。
1年分のカレンダーを表示するサンプルです。
ここまで親切にご回答していただき恐れ入ります。ありがとうございます!!
ここまで親切にご回答していただき恐れ入ります。ありがとうございます!!