Попробуйте это:
function getDates($year)
{
$dates = array();
date("L", mktime(0,0,0, 7,7, $year)) ? $days = 366 : $days = 365;
for($i = 1; $i <= $days; $i++){
$month = date('m', mktime(0,0,0,1,$i,$year));
$wk = date('W', mktime(0,0,0,1,$i,$year));
$wkDay = date('D', mktime(0,0,0,1,$i,$year));
$day = date('d', mktime(0,0,0,1,$i,$year));
$dates[$month][$wk][$wkDay] = $day;
}
return $dates;
}
вернет массив месяцев-> недель-> дней-> дней недели года, который вы передаете функции. Надеюсь, это должно быть легко пройти через массив, чтобы распечатать все. Я уверен, что есть много настроек, которые можно сделать, но это только начало.
Я бы также старался не печатать html, используя echo, например, вместо;
echo '<tr>';
for($i=1;$i<$firstDay['wday'];$i++){
echo '<td> </td>';
}
делать;
<tr>;
<?php for($i=1;$i<$firstDay['wday'];$i++){ ?>
<td><?php echo $var; ?></td>
<?php } ?>
Я думаю, это делает код более читабельным.
РЕДАКТИРОВАТЬ: Просто подумал, что я должен включить пример варианта использования, как показано ниже:
<?php $dates = getDates(2011);
$weekdays = array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'); ?>
<?php foreach($dates as $month => $weeks) { ?>
<table>
<tr>
<th><?php echo implode('</th><th>', $weekdays); ?></th>
</tr>
<?php foreach($weeks as $week => $days){ ?>
<tr>
<?php foreach($weekdays as $day){ ?>
<td>
<?php echo isset($days[$day]) ? $days[$day] : ' '; ?>
</td>
<?php } ?>
</tr>
<?php } ?>
</table>
<?php } ?>
Что дает вам вывод: