<?php
/**
* 获取日历数据
* @param $year 年
* @param $month 月
* @return array
*/
function getCalendarData($year, $month)
{
$monthResult = [];
$isFirstWeek = true;
$firstWeek = [];
$middleWeek = [];
$lastWeek = [];
//1、判断当前年、月 有多少天
$unix_time = mktime(0, 0, 0, $month, 1, $year);
$mont_day = intval(date('t', $unix_time));
//2、判断当前月的第一天,是周几
$first_day_week = intval(date('w', $unix_time));
for ($i = 0; $i < $first_day_week; $i++) {
$firstWeek[] = '';
}
//3、依次的循环日期数,当 $i % 7 时,说明是下一个星期,需要换行
for ($j = 1; $j <= $mont_day; $j++) {
$i++;
if ($isFirstWeek) {
if (count($firstWeek) == 7) {
$isFirstWeek = false;
$monthResult[] = $firstWeek;
$middleWeek[] = $j;
} else {
$firstWeek[] = $j;
}
} else {
$middleWeek[] = $j;
}
if ($i % 7 == 0) {
if (!empty($middleWeek)) {
$monthResult[] = $middleWeek;
$middleWeek = [];
}
}
if ($j == $mont_day) {
$lastWeek = $middleWeek;
}
}
//4、所有日期都循环后,判断是否到了表格末尾,如果没到,用空格填充
while ($i % 7 != 0) {
$i++;
$lastWeek[] = '';
}
if(!empty($lastWeek)){
$monthResult[] = $lastWeek;
}
return $monthResult;
}
//获取2020年5月的日历数据
$result = getCalendarData(2020, 5);
echo "<pre>";
print_r($result);
结果如下:
array:6 [▼ 0 => array:7 [▼ 0 => "" 1 => "" 2 => "" 3 => "" 4 => "" 5 => 1 6 => 2 ] 1 => array:7 [▼ 0 => 3 1 => 4 2 => 5 3 => 6 4 => 7 5 => 8 6 => 9 ] 2 => array:7 [▼ 0 => 10 1 => 11 2 => 12 3 => 13 4 => 14 5 => 15 6 => 16 ] 3 => array:7 [▼ 0 => 17 1 => 18 2 => 19 3 => 20 4 => 21 5 => 22 6 => 23 ] 4 => array:7 [▼ 0 => 24 1 => 25 2 => 26 3 => 27 4 => 28 5 => 29 6 => 30 ] 5 => array:7 [▼ 0 => 31 1 => "" 2 => "" 3 => "" 4 => "" 5 => "" 6 => "" ] ]
二维数组结果格式说明:
外层数组的键代表了第几周(0代表第一周,1代表第二周,2代表第三周….)
内层数组的键代表了周几(如:0代表周日,1代表周一,2代表周二, …., 6代表周六)