首页 > 解决方案 > 除日期外,将 PHP 生成的 DataPeriod 列表拆分为月和年

问题描述

所以我正在使用下面的代码生成两个日期之间所有日期的无序列表。它工作正常,但我想以一种方式打印它,它创建嵌套列表的年份和月份,然后是日期,即..

 - 2019
   - February
     - 02-01-2019
   - January
     - 01-01-2019
     - 01-02-2019
     ...
   ...
 - 2018
   ...
 - 2017
   ...

我能做些什么来轻松实现这一目标?

<?    
$begin = new DateTime( '2017-03-12' );
$end = new DateTime('2019-02-15');

$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);
$sdcheck = array();

foreach($daterange as $date){
    $sdcheck[] = "<li>".$date->format("m-d-Y")."</li>";
}

?>

<ul>
<?
$sdcheck = array_reverse($sdcheck);
echo implode($sdcheck);
?>
</ul>

标签: phpsortingdatedatetime

解决方案


我进行了一些更改以使其“更容易”。我没有反转数组的各个级别,而是对其进行了更改,以便反向生成日期周期。我还根据日期组织了带有级别的临时数组,所以现在[2019][April][]它已经分为年和月。

然后是使用嵌套foreach循环生成各个级别的列表的情况......

$begin = new DateTime( '2018-03-16' );
$end = new DateTime();

$interval = DateInterval::createFromDateString('-1 day');
$daterange = new DatePeriod($end, $interval ,$end->diff($begin)->days);
$sdcheck = array();
foreach($daterange as $date){
    $sdcheck[$date->format("Y")][$date->format("F")][] = "<li>".$date->format("m-d-Y")."</li>";
}

$output = "<ul>";
foreach ( $sdcheck as $year=>$months )   {
    $output .="<li>".$year."<ul>";
    foreach ( $months as $month=>$dates )   {
        $output .="<li>".$month."<ul>";
        $output .=implode($dates)."</ul>".PHP_EOL;
    }
    $output .="</ul>";
}
$output .="</ul>";

echo $output;

推荐阅读