PHP生成日曆(例項詳解)

gb4215287發表於2017-09-30

《PHP典型模組與專案實戰大全》第9章日程表模組(PHP+AJAX+XML),本章通過課程表模組的實現將AJAX技術介紹給讀者,讀者可以通過本章瞭解到AJAX的基本原理、PHP與AJAX是如何互動的,以及通過資料庫驅動的AJAX。本節為大家介紹PHP生成的日曆。

AD:

9.4  日曆程式設計

日程表的前端程式的核心是,通過PHP指令碼生成一個當前日期的日曆表格,再通過遍歷資料中的訊息事件,在有事件提醒的日期生成一個有"event"標識的連結,單擊該連結就可以非同步將對應的提醒資訊顯示在日曆表格的下方。

9.4.1  PHP生成的日曆

PHP生成日曆是這個模組邏輯上最複雜的部分,下面來看如何生成一個標準的日曆。日曆展示的部分是將星期和日期通過一張二維表格輸出到瀏覽器中的。日曆表格的形式如圖9.6所示。

 
圖9.6 日曆表格樣式

現在以2010年6月14日為例說明。6月份共有30天,在這個日曆表中共5行,首先需要確定當前所在的日期(當然也可以指定一個日期),比如14日,通過表格可以知道它在第3行對應星期一那列(第3周)。通常每個月第1天不是在表格開始的位置,位置並不固定,同樣不固定的還有每個月的週數,有時候是4周,有時候是5周。這樣,想要完成這個日曆表格就需要確定一些基礎的日期變數,下面具體來看需要設定的基礎變數。

PHP提供了date()函式,該函式提供了豐富的日期處理功能。現在需要獲得的資料有兩個,第一個是當月的總天數;第二個是該月的第一天所在星期中的第幾天,數字表示0(表示星期天)到6(表示星期六)。通過date()函式可以很容易獲得上面的資料。

  1. <?php 
  2. //date()函式的基本用法  
  3. $year = date('Y');      //獲得年份,例如2006 
  4. $month = date('n');     //獲得月份,例如04 
  5. $day = date('j');       //獲得日期,例如3 
  6. ?> 
通過mktime()函式和date()函式獲得當月的總天數。
  1. //獲得當月的總天數  
  2. $daysInMonth = date("t",mktime(0,0,0,$month,1,$year)); 
同樣是組合使用mktime()函式和date()函式,獲得該月的第一天所在星期中的第幾天,數字表示0(表示星期天)到6(表示星期六)。
  1. //獲得每個月的第一天,例如4 
  2. $firstDay = date("w", mktime(0,0,0,$month,1,$year)); 

現在重新來觀察下這個日曆表格,我們發現,表格中的值是從1到x(當月的總天數)。我們可以形象地通過一個座標來表示每一個位置(x,y),表格的起始位置是(0,0),結束位置是(5,4),當月第一天的起始位置是(0,3)。現在來建立一個二維陣列來儲存對應的日期。

(1)需要獲得表格的數目。

  1. //計算陣列中的日曆表格數  
  2. $tempDays = $firstDay + $daysInMonth; 
(2)需要算出該月一共有幾周(即表格的行數)。
  1. //獲得表格行數  
  2. $weeksInMonth = ceil($tempDays/7); 
(3)在獲得行數的變數之後,建立一個二維陣列用來存放日期資訊,程式碼如下:
  1. <?php 
  2. for($j=0;$j&lt;$weeksInMonth;$j++)  
  3. {  
  4.     for($i=0;$i&lt;7 
  5.     ;$i++)  
  6.     { 
  7.         $counter ++; 
  8.         $week [$j] [$i] = $counter; 
  9.     } 
  10. }  
  11. ?> 
(4)細心的讀者可能發現,上面的程式碼其實是一個雛型,因為它處理出來的資料並沒有過濾那些空白的表格單元。下面來繼續改造下這段程式碼,加入過濾和構造的部分。改造後的程式碼如下:
  1. <?php 
  2. //建立日期二維陣列  
  3. for($j = 0; $j < $weeksInMonth; $j ++) { 
  4.     for($i = 0; $i < 7; $i ++) { 
  5.         $counter ++; 
  6.         $week [$j] [$i] = $counter; 
  7.         //日期偏移量 
  8.         $week [$j] [$i] -= $firstDay; 
  9.         if (($week [$j] [$i] < 1) || ($week [$j] [$i] > $daysInMonth)) { 
  10.             $week [$j] [$i] = ""; 
  11.         } 
  12.     } 
  13. }  
  14. ?> 
(5)在獲得正確的二維陣列之後,就可以通過foreach()函式將儲存的日期資訊遍歷出來,同時插入HTML標籤建立日期,程式碼如下:
  1. <?php 
  2. $year = date ( 'Y' );   //獲得年份, 例如: 2006 
  3. $month = date ( 'n' );  //獲得月份, 例如: 04 
  4. $day = date ( 'j' );    //獲得日期, 例如: 3 
  5. $firstDay = date ( "w", mktime ( 0, 0, 0, $month, 1, $year ) ); 
  6.                                         //獲得當月第一天 
  7. $daysInMonth = date ( "t", mktime ( 0, 0, 0, $month, 1, $year ) ); 
  8.                                         //獲得當月的總天數 
  9. //echo $daysInMonth; 
  10. $tempDays = $firstDay + $daysInMonth;   //計算陣列中的日曆表格數 
  11. $weeksInMonth = ceil ( $tempDays/7 );   //算出該月一共有幾周(即表格的行數) 
  12. //建立一個二維陣列  
  13. for($j = 0; $j < $weeksInMonth; $j ++) { 
  14.     for($i = 0; $i < 7; $i ++) { 
  15.         $counter ++; 
  16.         $week [$j] [$i] = $counter; 
  17.         //offset the days 
  18.         $week [$j] [$i] -= $firstDay; 
  19.         if (($week [$j] [$i] < 1) || ($week [$j] [$i] > $daysInMonth)) { 
  20.             $week [$j] [$i] = ""; 
  21.         } 
  22.     } 
  23. }  
  24. ?> 
  25. <script type="text/JavaScript" src="calendar.js"></script> 
  26. <table width="400" border="1" cellpadding="2" cellspacing="2"> 
  27.     <tr> 
  28.         <th colspan='7'> 
  29.             <?php 
  30.             echo date ( 'M', mktime ( 0, 0, 0, $month, 1, $year ) ) . ' ' .             $year; 
  31.             ?> 
  32.         </th> 
  33.     </tr> 
  34.     <tr> 
  35.         <th>Sun</th> 
  36.         <th>Mon</th> 
  37.         <th>Tue</th> 
  38.         <th>Wed</th> 
  39.         <th>Thur</th> 
  40.         <th>Fri</th> 
  41.         <th>Sat</th> 
  42.     </tr> 
  43. <?php 
  44. foreach ( $week as $key => $val ) { 
  45.     echo "<tr>"; 
  46.     for($i = 0; $i < 7; $i ++) { 
  47.         echo "<td align='center'>" . $val [$i] . "</td>"; 
  48.     } 
  49.     echo "</tr>"; 
  50. }  
  51. ?> 
(6)在瀏覽器中執行上面的程式碼,得到一個完整的日曆表格,效果如圖9.7所示。
 
圖9.7 PHP生成日曆

來源:http://blog.sina.com.cn/s/blog_8a18c33d010158p3.html

相關文章