PHP 封装日历数据的处理函数

PHP piniu 1444浏览 0评论
<?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代表周六)


发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • * 昵称:
  • * 邮箱: