PHP生成日历(实例详解)

标签:
杂谈 |
分类: PHP |
《PHP典型模块与项目实战大全》第9章日程表模块(PHP+AJAX+XML),本章通过课程表模块的实现 将AJAX技术介绍给读者,读者可以通过本章了解到AJAX的基本原理、PHP与AJAX是如何交互的,以及通过数据库驱动的AJAX。本节为大家介绍 PHP生成的日历。
AD:
9.4
日程表的前端程序的核心是,通过PHP脚本生成一个当前日期的日历表格,再通过遍历数据中的消息事件,在有事件提醒的日期生成一个有"event"标识的链接,单击该链接就可以异步将对应的提醒信息显示在日历表格的下方。
9.4.1
PHP生成日历是这个模块逻辑上最复杂的部分,下面来看如何生成一个标准的日历。日历展示的部分是将星期和日期通过一张二维表格输出到浏览器中的。日历表格的形式如图9.6所示。
http://images.51cto.com/files/uploadimg/20111215/214634807.jpg |
图9.6 |
现在以2010年6月14日为例说明。6月份共有30天,在这个日历表中共5行,首先需要确定当前所在的日期(当然也可以指定一个日期),比如14 日,通过表格可以知道它在第3行对应星期一那列(第3周)。通常每个月第1天不是在表格开始的位置,位置并不固定,同样不固定的还有每个月的周数,有时候 是4周,有时候是5周。这样,想要完成这个日历表格就需要确定一些基础的日期变量,下面具体来看需要设定的基础变量。
PHP提供了date()函数,该函数提供了丰富的日期处理功能。现在需要获得的数据有两个,第一个是当月的总天数;第二个是该月的第一天所在星期中的第几天,数字表示0(表示星期天)到6(表示星期六)。通过date()函数可以很容易获得上面的数据。
-
<?php
- //date()函数的基本用法
-
$year
= date('Y');//获得年份,例如2006 -
$month
= date('n');//获得月份,例如04 -
$day
= date('j');//获得日期,例如3 -
?>
- //获得当月的总天数
-
$daysInMonth
= date("t",mktime(0,0,0,$month,1,$year));
- //获得每个月的第一天,例如4
-
$firstDay
= date("w",mktime(0,0,0,$month,1,$year));
现在重新来观察下这个日历表格,我们发现,表格中的值是从1到x(当月的总天数)。我们可以形象地通过一个坐标来表示每一个位置(x,y),表格的起始位置是(0,0),结束位置是(5,4),当月第一天的起始位置是(0,3)。现在来创建一个二维数组来存储对应的日期。
(1)需要获得表格的数目。
- //计算数组中的日历表格数
-
$tempDays
= $firstDay + $daysInMonth;
- //获得表格行数
-
$weeksInMonth
= ceil($tempDays/7);
-
<?php
-
for($j=0;$j<$weeksInMonth;$j++)
- {
-
for($ -
;$i++) -
{ -
$counter ++; -
$week [$j] [$i] = $counter; -
} - }
-
?>
-
<?php
- //创建日期二维数组
-
for($j
= 0;$j <$weeksInMonth; $j ++) { -
for($ = 0;$i <7; $i ++) { -
$counter ++; -
$week [$j] [$i] = $counter; -
//日期偏移量 -
$week [$j] [$i] $firstDay; -
if (($week [$j] [$i] 1) || >($week [$j] [$i] $daysInMonth)) { -
$week [$j] [$i] = ""; -
} -
} - }
-
?>
-
<?php
-
$year
= date( 'Y' ); //获得年份, 例如: 2006 -
$month
= date( 'n' ); //获得月份, 例如: 04 -
$day
= date( 'j' ); //获得日期, 例如: 3 -
$firstDay
= date( "w", mktime ( 0, 0, 0, $month, 1, $year ) ); -
//获得当月第一天 -
$daysInMonth
= date( "t", mktime ( 0, 0, 0, $month, 1, $year ) ); -
//获得当月的总天数 - //echo
$daysInMonth; -
$tempDays
= $firstDay + $daysInMonth; //计算数组中的日历表格数 -
$weeksInMonth
= ceil( $tempDays/7 ); //算出该月一共有几周(即表格的行数) - //创建一个二维数组
-
for($j
= 0;$j <$weeksInMonth; $j ++) { -
for($ = 0;$i <7; $i ++) { -
$counter ++; -
$week [$j] [$i] = $counter; -
//offset the days -
$week [$j] [$i] $firstDay; -
if (($week [$j] [$i] 1) || >($week [$j] [$i] $daysInMonth)) { -
$week [$j] [$i] = ""; -
} -
} - }
-
?>
-
<script
type="text/JavaScript" src="calendar.js"></script> -
<table
width="400" border="1" cellpadding="2" cellspacing="2"> -
-
colspan='7'> -
-
echo date ( 'M', mktime ( 0, 0, 0, $month, 1, $year ) ) . ' ' . $year; -
-
-
-
-
-
-
-
-
-
-
-
-
<?php
-
foreach
( key$week as $ = >$val ) { -
echo " -
for($ = 0;$i <7; $i ++) { -
echo " align='center'>" . </td>";$val [$i] . " -
} -
echo " - }
-
?>
http://images.51cto.com/files/uploadimg/20111215/214907814.jpg |
图9.7 |