除了日期以外,将PHP生成的DataPeriod列表拆分为月份和年份

时间:2019-07-12 17:15:54

标签: php sorting date datetime

因此,我正在使用以下代码生成两个日期之间所有日期的无序列表。它工作正常,但我想用一种打印方式来创建嵌套的列表,这些嵌套列表会存储年月,然后显示日期,即...

 - 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>

2 个答案:

答案 0 :(得分:1)

我做了一些更改,使其更“容易”。我没有改变数组的各个级别,而是对其进行了更改,以便日期周期是反向生成的。我还根据日期对临时数组进行了级别划分,因此现在为[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;

答案 1 :(得分:0)

一种简单的方法是:


function createList($daterange)
{
    $sdcheck = [];
    foreach($daterange as $date){   
        $sdcheck[$date->format('Y')][$date->format('F')][$date->format("m-d-Y")] = $date->format("m-d-Y");
    }

    $html = '';
    foreach ($sdcheck as $key => $element) {
        $html .= '<ul><li>' . $key;
        if (is_array($element)) {
            $html .= createList($element);
        }
        $html .= '</li></ul>';
    }
    return $html;
}