生活随笔
收集整理的這篇文章主要介紹了
PHP生成日历(实例详解)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
《PHP典型模塊與項(xiàng)目實(shí)戰(zhàn)大全》第9章日程表模塊(PHP+AJAX+XML),本章通過(guò)課程表模塊的實(shí)現(xiàn)將AJAX技術(shù)介紹給讀者,讀者可以通過(guò)本章了解到AJAX的基本原理、PHP與AJAX是如何交互的,以及通過(guò)數(shù)據(jù)庫(kù)驅(qū)動(dòng)的AJAX。本節(jié)為大家介紹PHP生成的日歷。
AD:
9.4? 日歷程序設(shè)計(jì)
日程表的前端程序的核心是,通過(guò)PHP腳本生成一個(gè)當(dāng)前日期的日歷表格,再通過(guò)遍歷數(shù)據(jù)中的消息事件,在有事件提醒的日期生成一個(gè)有"event"標(biāo)識(shí)的鏈接,單擊該鏈接就可以異步將對(duì)應(yīng)的提醒信息顯示在日歷表格的下方。
9.4.1? PHP生成的日歷
PHP生成日歷是這個(gè)模塊邏輯上最復(fù)雜的部分,下面來(lái)看如何生成一個(gè)標(biāo)準(zhǔn)的日歷。日歷展示的部分是將星期和日期通過(guò)一張二維表格輸出到瀏覽器中的。日歷表格的形式如圖9.6所示。
現(xiàn)在以2010年6月14日為例說(shuō)明。6月份共有30天,在這個(gè)日歷表中共5行,首先需要確定當(dāng)前所在的日期(當(dāng)然也可以指定一個(gè)日期),比如14日,通過(guò)表格可以知道它在第3行對(duì)應(yīng)星期一那列(第3周)。通常每個(gè)月第1天不是在表格開(kāi)始的位置,位置并不固定,同樣不固定的還有每個(gè)月的周數(shù),有時(shí)候是4周,有時(shí)候是5周。這樣,想要完成這個(gè)日歷表格就需要確定一些基礎(chǔ)的日期變量,下面具體來(lái)看需要設(shè)定的基礎(chǔ)變量。
PHP提供了date()函數(shù),該函數(shù)提供了豐富的日期處理功能?,F(xiàn)在需要獲得的數(shù)據(jù)有兩個(gè),第一個(gè)是當(dāng)月的總天數(shù);第二個(gè)是該月的第一天所在星期中的第幾天,數(shù)字表示0(表示星期天)到6(表示星期六)。通過(guò)date()函數(shù)可以很容易獲得上面的數(shù)據(jù)。
<?php?//date()函數(shù)的基本用法 ?$year?=?date('Y');??????//獲得年份,例如2006?$month?=?date('n');?????//獲得月份,例如04?$day?=?date('j');???????//獲得日期,例如3??>? 通過(guò)mktime()函數(shù)和date()函數(shù)獲得當(dāng)月的總天數(shù)。
//獲得當(dāng)月的總天數(shù) ?$daysInMonth?=?date("t",mktime(0,0,0,$month,1,$year));? 同樣是組合使用mktime()函數(shù)和date()函數(shù),獲得該月的第一天所在星期中的第幾天,數(shù)字表示0(表示星期天)到6(表示星期六)。
//獲得每個(gè)月的第一天,例如4?$firstDay?=?date("w",?mktime(0,0,0,$month,1,$year));?
現(xiàn)在重新來(lái)觀察下這個(gè)日歷表格,我們發(fā)現(xiàn),表格中的值是從1到x(當(dāng)月的總天數(shù))。我們可以形象地通過(guò)一個(gè)坐標(biāo)來(lái)表示每一個(gè)位置(x,y),表格的起始位置是(0,0),結(jié)束位置是(5,4),當(dāng)月第一天的起始位置是(0,3)。現(xiàn)在來(lái)創(chuàng)建一個(gè)二維數(shù)組來(lái)存儲(chǔ)對(duì)應(yīng)的日期。
(1)需要獲得表格的數(shù)目。
//計(jì)算數(shù)組中的日歷表格數(shù) ?$tempDays?=?$firstDay?+?$daysInMonth;? (2)需要算出該月一共有幾周(即表格的行數(shù))。
//獲得表格行數(shù) ?$weeksInMonth?=?ceil($tempDays/7);? (3)在獲得行數(shù)的變量之后,創(chuàng)建一個(gè)二維數(shù)組用來(lái)存放日期信息,代碼如下:
<?php?for($j=0;$j<$weeksInMonth;$j++)??{ ?????for($i=0;$i<7?????;$i++)??????{?????????$counter?++;?????????$week?[$j]?[$i]?=?$counter;?????}?} ??>? (4)細(xì)心的讀者可能發(fā)現(xiàn),上面的代碼其實(shí)是一個(gè)雛型,因?yàn)樗幚沓鰜?lái)的數(shù)據(jù)并沒(méi)有過(guò)濾那些空白的表格單元。下面來(lái)繼續(xù)改造下這段代碼,加入過(guò)濾和構(gòu)造的部分。改造后的代碼如下:
<?php?//創(chuàng)建日期二維數(shù)組 ?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)在獲得正確的二維數(shù)組之后,就可以通過(guò)foreach()函數(shù)將存儲(chǔ)的日期信息遍歷出來(lái),同時(shí)插入HTML標(biāo)簽創(chuàng)建日期,代碼如下:
<?php?$year?=?date?(?'Y'?);???//獲得年份,?例如:?2006?$month?=?date?(?'n'?);??//獲得月份,?例如:?04?$day?=?date?(?'j'?);????//獲得日期,?例如:?3?$firstDay?=?date?(?"w",?mktime?(?0,?0,?0,?$month,?1,?$year?)?);?????????????????????????????????????????//獲得當(dāng)月第一天?$daysInMonth?=?date?(?"t",?mktime?(?0,?0,?0,?$month,?1,?$year?)?);?????????????????????????????????????????//獲得當(dāng)月的總天數(shù)?//echo?$daysInMonth;?$tempDays?=?$firstDay?+?$daysInMonth;???//計(jì)算數(shù)組中的日歷表格數(shù)?$weeksInMonth?=?ceil?(?$tempDays/7?);???//算出該月一共有幾周(即表格的行數(shù))?//創(chuàng)建一個(gè)二維數(shù)組 ?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)在瀏覽器中運(yùn)行上面的代碼,得到一個(gè)完整的日歷表格,效果如圖9.7所示。
來(lái)源:http://blog.sina.com.cn/s/blog_8a18c33d010158p3.html
總結(jié)
以上是生活随笔為你收集整理的PHP生成日历(实例详解)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。