作者: 溪水
<?php
/**
* 生成某年某月的日历
* @param $weekStart int 每周第一天是周几
* @param $linkUrl array 给日历里面的某些天添加一个a标签
*/
function generateCalendar( $month = 0, $year = 0, $weekStart = 0, $linkUrl = array() )
{
$year = $year ? $year : date( 'Y' );
$month = $month ? $month : date( 'm' );
$time = mktime( 0, 0, 0, $month, 1, $year );
$weekMap = array( 0 => 'Su', 1 => 'Mo', 2 => 'Tu', 3 => 'We',
4 => 'Th', 5 => 'Fr', 6 => 'Sa' );
$weekEnd = ( $weekStart + 6 ) % 7;
$day1week = date( 'w', $time );
$lastDay = date( 't', $time );
$curDay = $weekStart;
echo '<table border=0 cellpadding=4>';
echo '<tr>';
echo "<th colspan='7'>{$year}年{$month}月</th>";
echo "</tr>\n";
// 输出星期名字
echo '<tr>';
for( $i = 0; $i < 7; $i ++ )
{
echo "<td>{$weekMap[ ( $weekStart + $i ) % 7 ]}</td>";
}
echo "</tr>\n";
// 输出前导空白
echo '<tr>';
while( $curDay != $day1week )
{
echo '<td> </td>';
$curDay = ( $curDay + 1 ) % 7;
}
// 输出日期
for( $i = 1; $i <= $lastDay; $i ++ )
{
if( ! empty( $linkUrl[ $i ] ))
{
$b = "<a href='{$linkUrl[ $i ]}'>";
$e = '</a>';
} else
{
$b = '';
$e = '';
}
echo "<td>$b$i$e</td>";
if( $curDay == $weekEnd )
{
echo "</tr>\n<tr>";
}
$curDay = ( $curDay + 1 ) % 7;
}
// 输出后空白
$leave = ( $weekEnd - $curDay + 8 ) % 7;
for( $i = 0; $i < $leave; $i ++ )
{
echo '<td> </td>';
}
echo "</tr>\n";
echo '</table>';
}
// 测试代码, 输出 2000年1月 - 2020年12月 的日期表.
for( $j = 2000; $j < 2020; $j ++ )
{
for( $i = 1; $i <= 12; $i ++ )
{
echo '<div style="float: left">';
generateCalendar($i, $j, 0, array( rand( 1, 31 ) => 'http://s.com/1', rand( 1, 31 ) => 'http://s.com/2' ) );
echo '</div>';
}
echo '<div style="clear: both"></div>';
}