+效果
+无题
这次给自己的练习是写个日历的代码
开始以为很简单,到后来写着写着自己都晕了。
我的思路是来自学习C语言的一个练习题
那个练习题是要求在屏幕打印出如图所示图形:
思路是:获取每月第一天和最后一天是星期几,用FOR循环输出,其他的也用FOR循环输出。
虽然我写出来了,但是感觉比较繁琐,而且可读性不强,PHP函数库的丰富没有体现出来。
我想还有改进的空间,大家来指点指点吧。
+代码
复制内容到剪贴板
代码:
<?
$y=$_GET['y'];
$m=$_GET['m'];
function calendar($y,$m){
$months=array('January','February','March','April','May','June','July','August','September','October','November','December');
$days=array('31','28','31','30','31','30','31','31','30','31','30','31');
if($y==$today['year']&&$m==$today['mon'])
{
$today=getdate();
}
else
{
$date="1 ".$months[$m-1]." ".$y;
$today=getdate(strtotime($date));
}
//print_r($today);
$wd=$today['wday'];
$md=$today['mday'];
$m=$m?$m:$today['mon'];
$y=$y?$y:$today['year'];
if(!($y%4))
{$days[1]=29;}
if($md<=7)
{
$mfd=$wd-($md-1);
$mfd=$mfd>0?$mfd:($mfd+7);
}
else
{
$mfd=(8-($md-$wd)%7)%7;
}
$mld=($days[$m-1]-(8-$mfd))%7;
$mld=$mld?$mld:7;
$plusweek=($mld+7)%7?2:1;
$weeks=($days[$m-1]-(8-$mfd)-$mld)/7+$plusweek;
$forarray=array();
array_push($forarray,$mfd."7");
if($mld==7)
{
$lines=$weeks-1;
}
else
{
$lines=$weeks-2;
}
for($i=0;$i<$lines;$i++)
{array_push($forarray,"17");}
array_push($forarray,"1".$mld);
$ms=1;
if($m==1)
{
$prey=$y-1;
$prem=12;
$nexy=$y;
$nexm=(12+($m+1))%12;
$nexm=$nexm?$nexm:0;
}
else if($m>1&&$m<12)
{
$nexy=$prey=$y;
$prem=(12+($m-1))%12;
$prem=$prem?$prem:12;
$nexm=(12+($m+1))%12;
$nexm=$nexm?$nexm:0;
}
else
{
$prey=$y;
$prem=(12+($m-1))%12;
$prem=$prem?$prem:12;
$nexy=$y+1;
$nexm=1;
}
echo "<table>\n<thead><tr><th colspan='1'><a href='?y={$prey}&m={$prem}'>-</a></th><th colspan='5'> {$y} {$months[$m-1]} </th><th colspan='1'><a href='?y={$nexy}&m={$nexm}'>+</a></th></tr><thead>\n<tbody><tr><td>一</td><td>二</td><td>三</td><td>四</td><td>五</td><td>六</td><td>日</td></tr>";
for($i=0;$i<count($forarray);$i++)
{
$s=substr($forarray[$i],0,1);
$e=substr($forarray[$i],1,2);
echo "<tr>";
for($j=1;$j<=$e;$j++)
{
if($j<$s)
{echo "<td></td>";}
else
{echo "<td>{$ms}</td>";
$ms++;}
}
echo "</tr>\n";
}
//echo "</tbody></table>";
//echo "{$m}月第一天是星期{$mfd}<br />";
//echo "{$m}月最后一天是星期{$mld}<br />";
//echo "{$m}月跨度{$weeks}周".count($forarray);
//print_r($forarray);
}
calendar($y,$m);
?>