電子書籍の厳選無料作品が豊富!

PHP初心者です。
ただ今カレンダーを作成しております。

コードは以下です。

<?php

$d=isset($_GET['d'])? $_GET['d']:date("Y-n-d");

list($year,$month,$day)=explode("-",$d);

$prev=date("Y-n-d",mktime(0,0,0,$month-1,1,$year));

$next=date("Y-n-d",mktime(0,0,0,$month+1,1,$year));

$timestamp = mktime(0,0,0,$month,1,$year);

$fd=date("w",$timestamp);
$ld=date("t",$timestamp);

?>

<table>
<tr>
<th><a href="?d=<?php echo$prev; ?>">←</a></th>
<th colspan="5"><?php echo ("<h1>".$year."年".$month."月</h1>"); ?></th>
  <th><a href="?d=<?php echo$next; ?>">→</a></th>
</tr>
<tr>
<th class="sun">日</th>
<th>月</th>
<th>火</th>
<th>水</th>
<th>木</th>
<th>金</th>
<th class="sat">土</th>
</tr>
<tr>
<?php

$offset = $fd; //

while($fd--){
//$y ++; // 空セル文曜日を増やす
$s .= "<td></td>\n";
}

for($i=1; $i<=$ld; $i++){
$tmp = $offset + $i; //$tmpを$offset(1日までの空セル) と $i(31日)を足したものにする

$s.="<td>$i</td>\n"; //$sに日数とセルを追加

if($tmp % 7 ==0){ //$tmp(空セル+その月の日数)を7で割りあまりが0すなわち土曜日まできたら
$s.= "</tr>\n<tr>\n"; //</tr>で改行をいれる
}
}

$y=0;

for($i=1; $i<=$tmp; $i++){ //$tmp(空セル+その月の日数)になるまで
if($y % 7 == 0){ //7倍数になったら0にリセットする
$y = 0;
}
$y++; //リセットされた残りの曜日
}

$r=7-$y;

$y=0;

while($r--){
$s.='<td></td>';
}

for($i=1; $i<=$tmp; $i++){
if($tmp % 7 == 0){
$s.="</table>\n";
break;
}else{
$s.="</tr></table>\n";
break;
}
}

echo $s;

?>

一見出来ているようですが、最終日が土曜日になると余分な<tr>が入ってしまいます。

原因として、
if($tmp % 7 ==0){
$s.= "</tr>\n<tr>\n";}
と入れてあり、土曜日に7がくる(7で割り切れる数字で終わる)であるとは理解しているのですが、どうすれば、「最終セルに最後の日が来たときに<tr>をいれない」といった命令の仕方がわかりません。
素人ですので、分かりやすく解説していただけると嬉しいです。
よろしくお願い致します。

A 回答 (1件)

答えは簡単!


<tr> と </tr> を同時に入れなければいいのです。
ご自身で理解されている問題のポイントを
if ($tmp % 7 == 0 ) {
$s.= "</tr>\n";
}
として、
その前の $s.="<td>$i</td>\n"; の前に
if ($tmp % 7 == 1) {
$s.= "<tr>\n";
}
を書き足すと解決します。

この回答への補足

ご回答ありがとうございます。

とても参考になったのですが、これだと1日が日曜日だった場合に、空の<tr>が入るため、

・・・
<th class="sat">土</th>
</tr>
<tr>
<tr>
・・・

となってしまいます。

この場合でも、余分な<tr>をいれない方法はございますでしょうか?

1÷7のあまりって1なんですね。理解に苦しみます(>_<)

補足日時:2013/05/14 19:11
    • good
    • 0
この回答へのお礼

t_ohta様

あれから、QAサイトで教えていただき解決することが出来ました。
ご回答いただきありがとうございました。

ちなみに

if($tmp % 7 ==0){
$s.= "</tr>\n"; // 土曜だったら行を閉じる
if ($i < $ld) {
$s .= "<tr>\n"; // 最終日以外だったら次行の開始を準備
}
}

に記述を書き換えると解決いたしました。

お礼日時:2013/05/15 09:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!