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";

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:2006/11/20 16:25:18
  • 終了:2006/11/23 08:58:33

ベストアンサー

id:tobeoscontinue No.3

tobeoscontinue回答回数214ベストアンサー獲得回数542006/11/20 22:14:19

ポイント100pt

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=""を追加してます。

id:popattack

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

2006/11/23 08:46:08

その他の回答(3件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912006/11/20 17:32:27

ポイント23pt

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

今回は色をつけるのに 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;}

に変更してください。

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

id:popattack

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

2006/11/23 08:45:22
id:kn1967 No.2

kn1967回答回数2915ベストアンサー獲得回数3012006/11/20 17:48:52

ポイント5pt

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";

}

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

id:tobeoscontinue No.3

tobeoscontinue回答回数214ベストアンサー獲得回数542006/11/20 22:14:19ここでベストアンサー

ポイント100pt

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=""を追加してます。

id:popattack

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

2006/11/23 08:46:08
id:Mook No.4

Mook回答回数1312ベストアンサー獲得回数3912006/11/21 03:51:45

ポイント22pt

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&...

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

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

id:popattack

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

2006/11/23 08:46:47

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

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません