【问题标题】:How to display a dates in a matrix style?如何以矩阵样式显示日期?
【发布时间】:2019-12-02 12:06:39
【问题描述】:

考虑这种情况,员工可以申请请假,请假由一个或多个leave_lines组成,例如:

id   leave_id  leave_type   date_from     date_to
1       2      Annual       2019-12-17    2020-01-15
2       2      Off Duty     2020-01-16    2020-01-19
3       2      Holiday      2020-01-20    2020-01-29

如何根据该数据显示此输出:

Year | Month    [1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19][20][21][22][23][24][25][26][27][28][29][30][31]// 1 to 31 (Maximum total number of days of a months
2019  Dec       [ ][ ][ ][ ][ ][ ][ ][ ][ ][  ][  ][  ][  ][  ][  ][  ][ A][A ][A ][A ][A ][A ][A ][A ][A ][A ][A ][A ][A ][A ][A ]// Base on the data, leave line start from Dec 12, 2019 and Dec is until 31 only
2020  Jan       [A][A][A][A][A][A][A][A][A][A ][A ][A ][A ][A ][A ][O ][O ][O ][O ][H ][H ][H ][H ][H ][H ][H ][H ][H ][H ][  ][  ]// Base on the data, the annual leave start from dec 12, 2019 to January 15, 2020, and an Off Duty on January 16 to 19, 2020, also with Holiday on Jan 20 until Jan 29, 2020

这里,A 代表AnnualO 代表Off DutyH 代表Holiday。这就是我所做的:

if($this->leave->employee_leaves){
    foreach ($this->leave->employee_leaves as $key => $value) {
        PDF::writeHTMLCell(10, 0, '', '', $this->getYear($value->date_from), $border = $bottom, 0, 0, true, 'C', true);
        PDF::writeHTMLCell(11, 0, '', '', $this->getMonth($value->date_from), $border = $bottom, 0, 0, true, 'C', true);
        PDF::writeHTMLCell(16, 0, '', '', "", $border = 0, 0, 0, true, 'C', true);

        for ($i=1; $i <= 31 ; $i++) { 
            if($value->leave_type === 'Annual'){
                $start = $this->getDateFrom('Annual');

                PDF::writeHTMLCell(5, 0, '', '', $i < $start ? "" : "A" , $border = $boxThin, $i == 31 ? $ln = 1 : $ln = 0, 0, true, 'C', true);
            }

            if($value->leave_type === 'Off Duty'){
                $start = $this->getDateFrom('Off Duty');
                PDF::writeHTMLCell(5, 0, '', '', $i < $start ? "" : "O" , $border = $boxThin, $i == 31 ? $ln = 1 : $ln = 0, 0, true, 'C', true);
            }

            if($value->leave_type === 'Holiday'){
                $start = $this->getDateFrom('Holiday');
                PDF::writeHTMLCell(5, 0, '', '', $i < $start ? "" : "H" , $border = $boxThin, $i == 31 ? $ln = 1 : $ln = 0, 0, true, 'C', true);
            }
        }
    }
}

但输出显示如下,这不是我想要的:

Year | Month    [1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19][20][21][22][23][24][25][26][27][28][29][30][31]
2019  Dec       [ ][ ][ ][ ][ ][ ][ ][ ][ ][  ][  ][  ][  ][  ][  ][  ][ A][A ][A ][A ][A ][A ][A ][A ][A ][A ][A ][A ][A ][A ][A ]
2020  Jan       [ ][ ][ ][ ][ ][ ][ ][ ][ ][  ][  ][  ][  ][  ][  ][O ][O ][O ][O ][O ][O ][O ][O ][O ][O ][O ][O ][O ][O ][O ][O ]
2020  Jan       [ ][ ][ ][ ][ ][ ][ ][ ][ ][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ][H ][H ][H ][H ][H ][H ][H ][H ][H ][H ][H ][H ]

【问题讨论】:

    标签: php logic


    【解决方案1】:

    首先将数据排列成数组格式,如$array[year][month][day]

    $arrangeData = [];
    if ($this->leave->employee_leaves) {
        foreach ($this->leave->employee_leaves as $key => $value) {
            $currentDate = $value->date_form;
            for ($currentDate = $value->date_form; $currentDate <= $value->date_to;) {
                $year = date('Y', strtotime($value->date_from));
                $month = date('M', strtotime($value->date_from));
                $day = date('d', strtotime($value->date_from));
    
                if ($value->leave_type === 'Annual') {
                    $arrangeData[$year][$month][$day] = "A";
                }
    
                if ($value->leave_type === 'Off Duty') {
                    $arrangeData[$year][$month][$day] = "O";
                }
    
                if ($value->leave_type === 'Holiday') {
                    $arrangeData[$year][$month][$day] = "H";
                }
                $currentDate = date('Y-m-d', strtotime("+1 days", strtotime($value->date_from)));
            }
        }
    

    那么输出代码就是

        foreach ($arrangeData as $year => $monthData) {
            foreach ($monthData as $month => $days) {
    
                PDF::writeHTMLCell(10, 0, '', '', $year, $border = $bottom, 0, 0, true, 'C', true);
                PDF::writeHTMLCell(11, 0, '', '', $month, $border = $bottom, 0, 0, true, 'C', true);
                PDF::writeHTMLCell(16, 0, '', '', "", $border = 0, 0, 0, true, 'C', true);
                for ($i = 1; $i <= 31; $i++) {
                    $code = isset($days[$i]) ? $days[$i] : "";
                    PDF::writeHTMLCell(5, 0, '', '', $code, $border = $boxThin, $i == 31 ? $ln = 1 : $ln = 0, 0, true, 'C', true);
                }
            }
        }
    }
    

    以上代码未经测试

    只遵循概念

    【讨论】:

    • for ($currentDate = $value-&gt;date_form; $currentDate &lt;= $value-&gt;date_to;) 没有终结符吗?因为我的页面一直在加载。
    • $currentDate = date('Y-m-d', strtotime("+1 days", strtotime($value->date_from)));将此“d”更正为“Y-m-d”
    • 为什么当我使用 die 并转储它时只填充开头,因此 array:2 [▼ 2019 =&gt; array:1 [▼ "Dec" =&gt; array:1 [▼ 17 =&gt; "A" ] ] 2020 =&gt; array:1 [▼ "Jan" =&gt; array:2 [▼ 16 =&gt; "O" 20 =&gt; "H" ] ] ] 顺便说一下,我将循环替换为 for($i = $start; $i &lt;= $end; $i-&gt;modify('+1 day')),因为我与前一个循环有无限循环。
    • 我刚刚对循环和分配$month, $year, $day 做了一些更改,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多