教大家制作简单的php日历


Posted in PHP onNovember 17, 2015

最近的一个项目中,需要将数据用日历方式显示,网上有很多的JS插件,后面为了自己能有更大的控制权,决定自己制作一个日历显示。如下图所示:

教大家制作简单的php日历

一、计算数据
1、new一个Calendar类

2、初始化两个下拉框中的数据,年份与月份

3、初始化要搜索的年份和月份

4、计算得出日历中每一天的数据信息,包括css、天数

<?php
 require_once 'calendar.php';
 $util = new Calendar();
 $years = array(2012, 2013, 2014, 2015, 2016);//年份选择自定义
 $months = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);//月份数组
 //获取post的年份数据
 if(empty($_POST['ddlYear'])) {
  $year = date('Y');
 }else {
  $year = $_POST['ddlYear'];
 }
 //获取post的月份数据
 if(empty($_POST['ddlMonth'])) {
  $month = date('n');
 }else {
  $month = $_POST['ddlMonth'];
 }

 $calendar = $util->threshold($year, $month);//获取各个边界值
 $caculate = $util->caculate($calendar);//计算日历的天数与样式
 $draws = $util->draw($caculate);//画表格,设置table中的tr与td
?>

二、html展示
1、休息天的背景色是不同的,不是当前搜索年月的天数字体颜色也是不同的

2、div中做初始化年份与月份的下拉框的操作,并选中当前要搜索的年月

3、数据已计算好,哪个td属于哪个tr也已做好,直接将table打印出来即可

<div style="padding:20px">
  <select name="ddlYear">
  <?php foreach($years as $data) {?>
   <option value="<?php echo $data?>" <?php if($year == $data) echo 'selected="selected"'?>><?php echo $data?></option>
  <?php }?>
  </select>
  <select name="ddlMonth">
  <?php foreach($months as $data) {?>
   <option value="<?php echo $data?>" <?php if($month == $data) echo 'selected="selected"'?>><?php echo $data?></option>
  <?php }?>
  </select>
  <input type="submit" value="修改"/>
 </div>
 <table width="100%" cellspacing="0" class="table_calendar">
  <thead class="f14">
    <tr>
     <td width="16%">日</td>
     <td width="14%">一</td>
     <td width="14%">二</td>
     <td width="14%">三</td>
     <td width="14%">四</td>
     <td width="14%">五</td>
     <td width="14%">六</td>
    </tr>
  </thead>
  <tbody class="f14">
   <?php foreach($draws as $draw) {?>
    <tr>
    <?php foreach($draw as $date) {?>
     <td class="<?php echo $date['tdclass']?>">
      <p class="<?php echo $date['pclass']?>"><?php echo $date['day']?></p>
     </td>
    <?php }?> 
    </tr>
   <?php }?>
  </tbody>
 </table>

三、Calendar类
1、threshold方法,生成日历的各个边界值

1)计算这个月总天数

2)计算这个月第一天与最后一天,各是星期几

3)计算日历中的第一个日期与最后一个日期

/**
  * @deprecated 生成日历的各个边界值
  * @param string $year
  * @param string $month
  * @return array
  */
 function threshold($year, $month) {
  $firstDay = mktime(0, 0, 0, $month, 1, $year);
  $lastDay = strtotime('+1 month -1 day', $firstDay);
  //取得天数 
  $days = date("t", $firstDay);
  //取得第一天是星期几
  $firstDayOfWeek = date("N", $firstDay);
  //获得最后一天是星期几
  $lastDayOfWeek = date('N', $lastDay);
  
  //上一个月最后一天
  $lastMonthDate = strtotime('-1 day', $firstDay);
  $lastMonthOfLastDay = date('d', $lastMonthDate);
  //下一个月第一天
  $nextMonthDate = strtotime('+1 day', $lastDay);
  $nextMonthOfFirstDay = strtotime('+1 day', $lastDay);
  
  //日历的第一个日期
  if($firstDayOfWeek == 7)
   $firstDate = $firstDay;
  else 
   $firstDate = strtotime('-'. $firstDayOfWeek .' day', $firstDay);
  //日历的最后一个日期
  if($lastDayOfWeek == 6)
   $lastDate = $lastDay;
  elseif($lastDayOfWeek == 7) 
   $lastDate = strtotime('+6 day', $lastDay);
  else
   $lastDate = strtotime('+'.(6-$lastDayOfWeek).' day', $lastDay);
  
  return array(
    'days' => $days, 
    'firstDayOfWeek' => $firstDayOfWeek, 
    'lastDayOfWeek' => $lastDayOfWeek,
    'lastMonthOfLastDay' => $lastMonthOfLastDay,
    'firstDate' => $firstDate,
    'lastDate' => $lastDate,
    'year' => $year,
    'month' => $month
  );
 }

2、caculate方法,计算日历的天数与样式

1)将上个月的天数计算出来,本月第一天的星期不是星期天的话,就需要根据上个月的最后一天计算

2)将本月的天数遍历出来,如果是休息天就加上特殊的css样式

3)将下个月的天数计算出来,分三种情况,星期日、星期六和工作日

/**
  * @author Pwstrick
 * @param array $calendar 通过threshold方法计算后的数据
  * @deprecated 计算日历的天数与样式
  */
 function caculate($calendar) {
  $days = $calendar['days'];
  $firstDayOfWeek = $calendar['firstDayOfWeek'];//本月第一天的星期
  $lastDayOfWeek = $calendar['lastDayOfWeek'];//本月最后一天的星期
  $lastMonthOfLastDay = $calendar['lastMonthOfLastDay'];//上个月的最后一天
  $year = $calendar['year'];
  $month = $calendar['month'];
  
  $dates = array();
  if($firstDayOfWeek != 7) {
   $lastDays = array();
   $current = $lastMonthOfLastDay;//上个月的最后一天
   for ($i = 0; $i < $firstDayOfWeek; $i++) {
    array_push($lastDays, $current);//添加上一个月的日期天数
    $current--;
   }
   $lastDays = array_reverse($lastDays);//反序
   foreach ($lastDays as $index => $day) {
    array_push($dates, array('day' => $day, 'tdclass' => ($index ==0 ?'rest':''), 'pclass' => 'outter'));
   }
  }
  
  //本月日历信息
  for ($i = 1; $i <= $days; $i++) {
   $isRest = $this->_checkIsRest($year, $month, $i);
   //判断是否是休息天
   array_push($dates, array('day' => $i, 'tdclass' => ($isRest ?'rest':''), 'pclass' => ''));
  }
  
  //下月日历信息
  if($lastDayOfWeek == 7) {//最后一天是星期日
   $length = 6;
  }
  elseif($lastDayOfWeek == 6) {//最后一天是星期六
   $length = 0;
  }else {
   $length = 6 - $lastDayOfWeek;
  }
  for ($i = 1; $i <= $length; $i++) {
   array_push($dates, array('day' => $i, 'tdclass' => ($i==$length ?'rest':''), 'pclass' => 'outter'));
  }
  
  return $dates;
 }

3、draw方法,画表格,设置table中的tr与td

1)数据将要用table标签来显示,所以这里要将各个tr下面的td排列好

2)$index % 7 == 0 计算表格每行的第一列

3)$index % 7 == 6 || $index == ($length-1) 计算每行的最后一列,或$caculate的最后一个数据

4)将中间行添加到$tr中,就是每一行的array

 /**
  * @author Pwstrick
  * @param array $caculate 通过caculate方法计算后的数据
  * @deprecated 画表格,设置table中的tr与td
  */
 function draw($caculate) {
  $tr = array();
  $length = count($caculate);
  $result = array();
  foreach ($caculate as $index => $date) {
   if($index % 7 == 0) {//第一列
    $tr = array($date);
   }elseif($index % 7 == 6 || $index == ($length-1)) {
    array_push($tr, $date);
    array_push($result, $tr);//添加到返回的数据中
    $tr = array();//清空数组列表
   }else {
    array_push($tr, $date);
   }
  }
  return $result;
 }

通过本文大家应该知道日历制作的方法了,那就趁热打铁,做一个属于自己日历。

附源码:教大家制作简单的php日历

PHP 相关文章推荐
php简单实现快速排序的方法
Apr 04 PHP
PHP中生成UUID自定义函数分享
Jun 10 PHP
php实现短信发送代码
Jul 05 PHP
codeigniter实现get分页的方法
Jul 10 PHP
php简单生成随机数的方法
Jul 30 PHP
PHP magento后台无法登录问题解决方法
Nov 24 PHP
Yii2中添加全局函数的方法分析
May 04 PHP
ThinkPHP下表单令牌错误与解决方法分析
May 20 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
Jul 16 PHP
如何修改Laravel中url()函数生成URL的根地址
Aug 11 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
Sep 28 PHP
PHP使用PDO访问oracle数据库的步骤详解
Sep 29 PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
Nov 16 #PHP
PHP Yii框架之表单验证规则大全
Nov 16 #PHP
Yii2.0高级框架数据库增删改查的一些操作
Nov 16 #PHP
yii添删改查实例
Nov 16 #PHP
PHP的运行机制与原理(底层)
Nov 16 #PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
Nov 15 #PHP
php经典算法集锦
Nov 14 #PHP
You might like
PHP 删除一个目录及目录下的所有文件的函数代码
2010/05/26 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
php图片加水印原理(超简单的实例代码)
2013/01/18 PHP
getJSON跨域SyntaxError问题分析
2014/08/07 PHP
PHP 根据key 给二维数组分组
2016/12/09 PHP
一段非常简单的让图片自动切换js代码
2006/11/10 Javascript
js去除空格的12种实用方法
2013/11/08 Javascript
给js文件传参数(详解)
2014/07/13 Javascript
JavaScript拆分字符串时产生空字符的解决方案
2014/09/26 Javascript
jquery实现焦点图片随机切换效果的方法
2015/03/12 Javascript
Javascript中的getUTCHours()方法使用详解
2015/06/10 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
2015/07/01 Javascript
JavaScript开发者必备的10个Sublime Text插件
2016/02/27 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
2017/07/27 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
[07:47]DOTA2国际邀请赛采访专栏:探访Valve总部
2013/08/08 DOTA
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
关于Python 3中print函数的换行详解
2017/08/08 Python
Python3实现腾讯云OCR识别
2018/11/27 Python
Python 虚拟空间的使用代码详解
2019/06/10 Python
Python generator生成器和yield表达式详解
2019/08/08 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
Jupyter Notebook添加代码自动补全功能的实现
2021/01/07 Python
opencv python 对指针仪表读数识别的两种方式
2021/01/14 Python
使用SVG实现提示框功能的示例代码
2020/06/05 HTML / CSS
社团文化节策划书
2014/02/01 职场文书
学校三节实施方案
2014/06/09 职场文书
工商管理自荐书
2014/07/06 职场文书
2015年机关党委工作总结
2015/05/23 职场文书
联欢会开场白
2015/06/01 职场文书
投资入股协议书
2016/03/22 职场文书
靠谱的活动总结
2019/04/16 职场文书
2019下半年英语教师的教学工作计划(3篇)
2019/09/25 职场文书
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python
SQL Server数据库备份和恢复数据库的全过程
2022/06/14 SQL Server