人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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┃--┃--┃--┃--┃
┣━╋━╋━╋━╋━╋━╋━┫
┃--┃--┃--┃--┃--┃--┃--┃
┗━┻━┻━┻━┻━┻━┻━┛

●質問者: popattack
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:10月 2006年 23 24 28
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● llusall
●0ポイント

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


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

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

デモ

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

◎質問者からの返答

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


2 ● ito-yu
●20ポイント
<?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>

◎質問者からの返答

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


3 ● ito-yu
●20ポイント

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

<?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>
◎質問者からの返答

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


4 ● ktoshi
●20ポイント

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

$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>';

◎質問者からの返答

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


5 ● Mook
●40ポイント ベストアンサー

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年分のカレンダーを表示するサンプルです。

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ