生活随笔
收集整理的這篇文章主要介紹了
PHP生成日历(实例详解)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
《PHP典型模塊與項目實戰大全》第9章日程表模塊(PHP+AJAX+XML),本章通過課程表模塊的實現將AJAX技術介紹給讀者,讀者可以通過本章了解到AJAX的基本原理、PHP與AJAX是如何交互的,以及通過數據庫驅動的AJAX。本節為大家介紹PHP生成的日歷。
AD:
9.4? 日歷程序設計
日程表的前端程序的核心是,通過PHP腳本生成一個當前日期的日歷表格,再通過遍歷數據中的消息事件,在有事件提醒的日期生成一個有"event"標識的鏈接,單擊該鏈接就可以異步將對應的提醒信息顯示在日歷表格的下方。
9.4.1? PHP生成的日歷
PHP生成日歷是這個模塊邏輯上最復雜的部分,下面來看如何生成一個標準的日歷。日歷展示的部分是將星期和日期通過一張二維表格輸出到瀏覽器中的。日歷表格的形式如圖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??>? 通過mktime()函數和date()函數獲得當月的總天數。
//獲得當月的總天數 ?$daysInMonth?=?date("t",mktime(0,0,0,$month,1,$year));? 同樣是組合使用mktime()函數和date()函數,獲得該月的第一天所在星期中的第幾天,數字表示0(表示星期天)到6(表示星期六)。
//獲得每個月的第一天,例如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;? (2)需要算出該月一共有幾周(即表格的行數)。
//獲得表格行數 ?$weeksInMonth?=?ceil($tempDays/7);? (3)在獲得行數的變量之后,創建一個二維數組用來存放日期信息,代碼如下:
<?php?for($j=0;$j<$weeksInMonth;$j++)??{ ?????for($i=0;$i<7?????;$i++)??????{?????????$counter?++;?????????$week?[$j]?[$i]?=?$counter;?????}?} ??>? (4)細心的讀者可能發現,上面的代碼其實是一個雛型,因為它處理出來的數據并沒有過濾那些空白的表格單元。下面來繼續改造下這段代碼,加入過濾和構造的部分。改造后的代碼如下:
<?php?//創建日期二維數組 ?for($j?=?0;?$j?<?$weeksInMonth;?$j?++)?{?????for($i?=?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]?=?"";?????????}?????}?} ??>? (5)在獲得正確的二維數組之后,就可以通過foreach()函數將存儲的日期信息遍歷出來,同時插入HTML標簽創建日期,代碼如下:
<?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($i?=?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">?????<tr>?????????<th?colspan='7'>?????????????<?php?????????????echo?date?(?'M',?mktime?(?0,?0,?0,?$month,?1,?$year?)?)?.?'?'?.?????????????$year;??????????????>?????????</th>?????</tr>?????<tr>?????????<th>Sun</th>?????????<th>Mon</th>?????????<th>Tue</th>?????????<th>Wed</th>?????????<th>Thur</th>?????????<th>Fri</th>?????????<th>Sat</th>?????</tr>?<?php?foreach?(?$week?as?$key?=>?$val?)?{?????echo?"<tr>";?????for($i?=?0;?$i?<?7;?$i?++)?{?????????echo?"<td?align='center'>"?.?$val?[$i]?.?"</td>";?????}?????echo?"</tr>";?} ??>? (6)在瀏覽器中運行上面的代碼,得到一個完整的日歷表格,效果如圖9.7所示。
來源:http://blog.sina.com.cn/s/blog_8a18c33d010158p3.html
總結
以上是生活随笔為你收集整理的PHP生成日历(实例详解)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。