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

PHPの質問です。
http://q.hatena.ne.jp/1163814335
で質問させて頂いて回答を頂きました。ここで土曜は黄色、日曜は
ピンクと判定させたいのですが、この条件文でどのように判定して
土日のみは色を付けると判定していいかわかりません。良い知恵が
あればお教えください。//土日色塗り判定の所に判定文を入れれば
いいとは思うのですが・・・

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>&nbsp;</td>\n";
}
if ( ( ( $i + $w ) % 7 ) == 0 ) {
print "</tr>\n";
if ( $i >= $n ) {
break;
}
}
}
print "</table>\n";

●質問者: popattack
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:print ピンク 黄色 HP
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● Mook
●23ポイント

前回は後出しの回答でしたが、いるかありがとうございました。

今回は色をつけるのに CSS を使用して色定義をしてみました。

CSS をヘッダで宣言する方法

<html>
<head>
<style type="text/css">
<!--
 th.sunday { background-color:#FFA0A0;}
 td.sunday { background-color:#FFA0A0;}
 th.saturday { background-color:#A0A0FF;}
 td.saturday { background-color:#A0A0FF;}
-->
</style>

<title>PHPカレンダサンプル</title>
<?php
function drawCalender( $y ,$m ) {
 $offset = 1; $tr_bgn = 1; $tr_end = 0; // 日曜始まり
// $offset = 2; $tr_bgn = 2; $tr_end = 1; // 月曜始まり

 $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";
 if ( $offset == 1 ) {
 print <<<DAY_TITLE
 <tr>
 <th class="sunday">日</th>
 <th>月</th><th>火</th><th>水</th><th>木</th><th>金</th>
 <th class="saturday">土</th>
 </tr>
DAY_TITLE;
 } else {
 print <<<DAY_TITLE
 <tr>
 <th>月</th><th>火</th><th>水</th><th>木</th><th>金</th>
 <th class="saturday">土</th>
 <th class="sunday">日</th>
 </tr>
DAY_TITLE;
 }
 print "<tr>\n";
 for( $i = $offset - $w ; $i <= $n + 7 ; $i++ ){
 if ( ( ( $i + $w ) % 7 ) == $tr_bgn ) {
 print "<tr>\n";
 }
 if ( ( 0 < $i ) && ( $i <= $n ) ) {
 switch ( ( $i + $w ) % 7 ) {
 case 0:
 print "<td class=\"saturday\" align=\"center\">$i</td>\n";
 break;
 case 1:
 print "<td class=\"sunday\" align=\"center\">$i</td>\n";
 break;
 default :
 print "<td align=\"center\">$i</td>\n";
 break;
 }
 } else {
 switch ( ( $i + $w ) % 7 ) {
 case 0:
 print "<td class=\"saturday\" >&nbsp;</td>\n";
 break;
 case 1:
 print "<td class=\"sunday\" >&nbsp;</td>\n";
 break;
 default :
 print "<td>&nbsp;</td>\n";
 break;
 }
 }
 if ( ( ( $i + $w ) % 7 ) == $tr_end ) {
 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>

土曜日の色は水色になっていますが、黄色にする場合は

 th.saturday { background-color:#FFFF00;}
 td.saturday { background-color:#FFFF00;}

に変更してください。

今回は、このまま実行できるかと思います。

◎質問者からの返答

CSSを使えば比較的簡単にできるんですね。余りcssを使ったことが無かったので勉強になりました。ありがとうございます。


2 ● kn1967
●5ポイント

http://q.hatena.ne.jp/1163814335

print "<td align=\"center\">$i</td>\n";

の1行を

if ( ( ( $i + $w ) % 7 ) == 0 ) {

print "<td align=\"center\" style=\"#FF0000\">$i</td>\n";

} else if ( ( ( $i + $w ) % 7 ) == 6 ) {

print "<td align=\"center\" style=\"#0000FF\">$i</td>\n";

} else {

print "<td align=\"center\" style=\"#FFFFFF\">$i</td>\n";

}

に置き換えてみてください。


3 ● tobeoscontinue
●100ポイント ベストアンサー

http://q.hatena.ne.jp/1164007516

<?php
function add_bgcolor($tag, $color)
{
 return ($color == "") ? $tag : rtrim($tag,'>').' bgcolor="'.$color.'">';
}

function array_tag($from, $data, $color, $to)
{
 $contents = '';
 foreach ($data as $item) {
 $c = each($color);
 if ($item == "--") $c['value'] = "";
 $contents .= add_bgcolor($from, $c['value']).$item.$to;
 }
 return $contents;
}

function calender($time)
{
 $date = getdate($time);
 $base = (7-(($date['mday']-1)%7)+$date['wday'])%7;// 1日が何曜日か
 $ldat = getdate(mktime(0, 0, 0, $date['mon']+1, 0, $date['year']));
 $last = $ldat['mday'];
 $caption = $date['year'].'年'.$date['mon'].'月';

 $list = array_merge(array_fill(0, $base+1, "--"),
 array("01","02","03","04","05","06","07","08","09"),
 range(10, $last),
 array_fill(0, 7, "--"));
 $list = array_splice($list, 1, intval(($base+$last+6)/7)*7);// 前後の余計なものを削除
 $color= array("pink", "", "", "", "", "", "yellow");

 $contents = '<tr align="center"><td colspan="7">'.$caption.'</td></tr>';
 $contents .= '<tr align="center">'.
 array_tag("<th>", array('日','月','火','水','木','金','土'),
 array('pink','#ffc8aa','#ffd088','#ffd866','#ffe044','#ffe822','yellow'), "</th>");
 '</tr>';
 while (count($list))
 $contents .= '<tr align="center">'.
 array_tag('<td>', array_splice($list, 0, 7), $color, '</td>').
 '</tr>';
 return '<table border="1" cellspacing="0">'.$contents.'</table>';
}

echo calender(time()-2678400);
echo calender(time());
echo calender(time()+2678400);
echo calender(mktime(0,0,0,1,1,2007));
?>

質問の趣旨からそれますが配列によるやりかたはどうでしょう。

配列にすることでif文が少なくなるので読みやすくなると思います。

上記コードでは$listに7×6の42程度のものを確保します。

array_splice()で表示しない無駄な部分を削除します。

後はwhileで一週間単位に無くなるまで表示(この場合は文字列として貯め込む)していくだけです。

色も配列にしました。色指定がある時<th>や<td>にadd_bgcolor()でbgcolor=""を追加してます。

◎質問者からの返答

配列を使ってもうまくいくんですね。考えもつかなかったです。目からうろこです。ありがとうございました。


4 ● Mook
●22ポイント

tobeoscontinue さんのカレンダーはデザインがいいですね。

コードも参考になりました。


popattack さんの質問からだいぶ外れてしますが、やっているうちにだんだん興が乗ってきたので、いろいろと機能を拡張してみました(暴走気味ですみません)。


値の受け渡し

<html>
<head>
<title>PHPカレンダサンプル</title>
<?php
//------------------------------------------------
// カレンダー表示関数2
//------------------------------------------------
function calender( $yy ,$mm, $st, $lng ) {
//------------------------------------------------
 $titleColor = array( '#F0C0C0','#F0F0C0','#F0F0C0','#F0F0C0','#F0F0C0','#F0F0C0','#D0D0F0' );
 $dayOfColor = array( '#F0C0C0','#F0F0C0','#F0F0C0','#F0F0C0','#F0F0C0','#F0F0C0','#D0D0F0' );

 if ( stripos( " ".$lng, "jp" ) != FALSE ) {
 $dayOfWeek = array( '日', '月','火','水','木','金','土' );
 $caption = "{$yy}年{$mm}月";
 $prevWord = "前"; $nextWord = "次";
 } else {
 $dayOfWeek = array( 'Sun','Mon','Tue','Wed','Thu','Fri','Sat' );
 $caption = "$yy ".date('F', mktime(0, 0, 0, $mm) );
 $prevWord = "PREV"; $nextWord = "NEXT";
 }

 if ( stripos( " ".$st, "sun" ) != FALSE ) {
 $offset = 6; // 日曜始まり
 } else {
 $offset = 5; // 月曜始まり
 // 日曜を最後尾に移動
 array_push( $dayOfWeek, array_shift( $dayOfWeek ) );
 array_push( $dayOfColor, array_shift( $dayOfColor ) );
 array_push( $titleColor, array_shift( $titleColor ) );
 }

 $firstDay = $offset + date('w', mktime(0, 0, 0, $mm, 1, $yy)); //1日の曜日(0:日?6:土)
 $dayOfMon = date('t', mktime(0, 0, 0, $mm, 1, $yy)); //$y年$m月の日数

 $nextYear = ( $mm == 12 ) ? ( $yy + 1 ) : $yy;
 $nextMon = ( $mm == 12 ) ? 1 : ( $mm + 1 );
 $prevYear = ( $mm == 1 ) ? ( $yy - 1 ) : $yy;
 $prevMon = ( $mm == 1 ) ? 12 : ( $mm - 1 );

 // 次月と翌月のURLリンク
 $next = "<a href=\"".$PHP_SELF."?year=$nextYear&mon=$nextMon&start={$st}&lang={$lng}\">{$nextWord}</a>";
 $prev = "<a href=\"".$PHP_SELF."?year=$prevYear&mon=$prevMon&start={$st}&lang={$lng}\">{$prevWord}</a>";

 // カレンダーの枠組み
$html = <<<HTML
 <table border="1" bordercolor="orange">
 <tr><td align="center" colspan="7" bgcolor="#FFFFC0">
 %PREV_LINK%
 <font color=\"#C0C0C0\"><b>  %CAPTION%  </font></b>
 %NEXT_LINK%
 </td></tr>
 <tr>%WEEK_TITLE%</tr>
 %DAY_TABLE%
 </table>
HTML;
 // 内容を置き換え
 $html = str_replace( "%CAPTION%", $caption, $html );
 $html = str_replace( "%NEXT_LINK%", $next, $html );
 $html = str_replace( "%PREV_LINK%", $prev, $html );
 $html = str_replace( "%WEEK_TITLE%", weekTitle( $dayOfWeek, $titleColor ), $html );
 for ( $wk=0 ; $wk < 6 ; $wk++ ) {
 $dayTable .= weekTable( $wk * 7 - $firstDay, $dayOfMon, $dayOfColor );
 }
 return str_replace( "%DAY_TABLE%", $dayTable, $html );
}
//------------------------------------------------
// 曜日の作成
//------------------------------------------------
function weekTitle( $wday, $color ) {
 $ret="<tr>\n";
 for ( $i = 0 ; $i < 7 ; $i++ ) {
 $ret .= "<th width=\"30\" align=\"center\" bgcolor=\"$color[$i]\">$wday[$i]</th>";
 }
 return $ret."</tr>\n";
}

//------------------------------------------------
// 一週間単位の日付
//------------------------------------------------
function weekTable( $startDay, $endDay, $color ) {
 if ( ( $startDay > $endDay ) || ( $startDay <= -6 ) ) {
 return;
 }
 $ret="<tr>\n";
 for ( $i = 0 ; $i < 7 ; $i++ ) {
 if ( ( $startDay + $i <= 0 ) || ( $startDay + $i > $endDay ) ) {
 $ret .= "<td bgcolor=\"$color[$i]\">&nbsp;</td>";
 } else {
 $dd = $startDay + $i;
 $ret .= "<td align=\"center\" bgcolor=\"$color[$i]\">{$dd}</td>";
 }
 }
 return $ret."</tr>\n";
}
?>
</head>
<body bgcolor="#E0F0E0">
 <center>
<?php
// 引数を設定
// カレンダーの表示月 ...?year=2006&mon=11
 if ( ( isset( $_GET["year"] ) ) && ( isset( $_GET["mon"] ) ) ) {
 $year = $_GET["year"];
 $mon = $_GET["mon"];
 } else { // 引数がなければ、今年を設定
 $year = date( 'Y' );
 $mon = date( 'n' );
 }
// 開始曜日のオプション ...?start="mon" or ?start="sun"
 $startDay = "SUN";
 if ( isset( $_GET["start"] ) ) {
 $startDay = ( stripos( " ".$_GET["start"],'mon' ) != false ) ? "mon" : "sun";
 }
// 言語オプション ...?lng="jp" or ?lng="en"
 $lang = "en";
 if ( isset( $_GET["lang"] ) ) {
 $lang = ( stripos( " ".$_GET["lang"],'jp' ) != false ) ? "jp" : "en";
 }
 print calender($year, $mon, $startDay, $lang );
?>
 </center>
</body>
</html>

ファイル名が calender.php だとしたら、URL で

指定した月を表示(指定しなければ今月)
http://..../calender.php?year=2007&mon=1

日本語で表示(デフォルトは英語)
・http://..../calender.php?lang=jp

英語で表示
・http://..../calender.php?lang=en

月曜始まり(デフォルトは日曜)
・http://..../calender.php?start=mon

組み合わせ
・http://..../calender.php?year=2010&mon=10&start=mon&...

などと指定することが出来ます。

興味がありましたら、御確認ください。

◎質問者からの返答

いろいろと機能がつかされて勉強になります。ありがとうございました。

関連質問


●質問をもっと探す●



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