如何使用 PHP 将日期数组转换为 3 级嵌套列表
Posted
技术标签:
【中文标题】如何使用 PHP 将日期数组转换为 3 级嵌套列表【英文标题】:How to turn an array of dates into a 3 level nested list using PHP 【发布时间】:2012-12-08 18:51:27 【问题描述】:我有一个按时间降序排列的日期数组。 当我遍历它们时,目前我正在拆分字符串并使用当前年份和月份并将其与上一个月份进行比较。
这是所需的输出(示例):
<ul>
<li><h1>2012</h1>
<ul>
<li><h2>Jan</h2>
<ul>
<li>Jan 1, 2012</li>
<li>Jan 5, 2012</li>
</ul>
</li>
<li><h2>Feb</h2>
<ul>
<li>Feb 3, 2012</li>
<li>Feb 8, 2012</li>
</ul>
</li>
</ul>
</li>
<li><h1>2011</h1>
<ul>
<li><h2>Jan</h2>
<ul>
<li>Jan 2, 2011</li>
<li>Mar 2, 2011</li>
</ul>
</li>
<li><h2>Feb</h2>
<ul>
<li>Feb 9, 2011</li>
<li>Feb 20, 2011</li>
</ul>
</li>
</ul>
</li>
</ul>
这是我的尝试之一:
$archiveDatehtml = '<ul id="menu">';
$c = 0;
foreach ($ArchiveDates as $k=>$value)
$dateArray = split(' ', $value);
if($currentYear !== $dateArray[2] && $c+1 < count($ArchiveDates))
if($c > 0) $archiveDateHTML .= '</ul>';
$archiveDateHTML .= '<h2 class="yearTitle">'.$dateArray[2].'</h2>';
$archiveDateHTML .= '<ul class="yearList">';
$newYear = 1;
if($currentMonth !== $dateArray[0] && $c+1 < count($ArchiveDates))
if($c > 0 && $newYear==0) $archiveDateHTML .= '</ul>';
$archiveDateHTML .= '<h3 class="monthTitle">'.$dateArray[0].'</h3>';
$archiveDateHTML .= '<ul class="monthList">';
$newYear = 0;
$archiveDateHTML .= $value;
$currentYear = $dateArray[2];
$currentMonth = $dateArray[0];
$c++;
$archiveDateHTML .= '</ul>';
上面的代码有一些明显的问题。我不断接近,但无法完全理解逻辑。请协助并非常感谢您!
【问题讨论】:
【参考方案1】:我会这样做。创建所需的输出数据结构,然后对其进行迭代以打印出 ul/li 元素。
不确定 HTML 是否有效,但您应该能够轻松解决该问题。在 php 中操作数据时,在第一次迭代期间同时进行操作和输出绝不是一个好主意。它使您的代码更加复杂。始终尝试解决问题。
<?
$dates = array("2012 Jan 1","2012 Jan 2","2012 Feb 4");
$output = array();
foreach($dates as $date)
list($year, $month, $day) = split(' ', $date);
$output[$year][$month][] = $day;
foreach($output as $year => $months)
print <<<HTML
<ul>
<li><h1>$year</h1>
<ul>
HTML;
foreach($months as $month => $days)
print <<<HTML
<li><h2>$month</h2>
<ul>
HTML;
print "<li>$month $day, $year</li>\n";
print <<<HTML
</ul>
</li>
HTML;
print <<<HTML
</ul>
</li>
</ul>
HTML;
【讨论】:
使用@sberry 的回声,它们更整洁。我使用 heredocs 只是因为从您的问题中复制粘贴更容易。 非常好!非常感谢!【参考方案2】:类似于paulgrav,这是我的回答:
$dates = array(
'Jan 1, 2012',
'Jan 5, 2012',
'Feb 3, 2012',
'Feb 8, 2012',
'Jan 2, 2011',
'Mar 2, 2011',
'Feb 9, 2011',
'Feb 20, 2011');
$out = array();
foreach ($dates as $date)
list($m, $d, $y) = explode(" ", $date);
$out[$y][$m][] = $date;
foreach ($out as $year => $group)
echo "<ul>\n";
echo " <li><h1>$year</h1>\n";
echo " <ul>\n";
foreach ($group as $month => $dates)
echo " <li><h2>$month</h2>\n";
echo " <ul>\n";
foreach ($dates as $date)
echo " <li>$date</li>\n";
echo " </ul>\n";
echo " </li>\n";
echo " </ul>\n";
echo " </li>\n";
echo "</ul>\n";
输出
<ul>
<li><h1>2012</h1>
<ul>
<li><h2>Jan</h2>
<ul>
<li>Jan 1, 2012</li>
<li>Jan 5, 2012</li>
</ul>
</li>
<li><h2>Feb</h2>
<ul>
<li>Feb 3, 2012</li>
<li>Feb 8, 2012</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><h1>2011</h1>
<ul>
<li><h2>Jan</h2>
<ul>
<li>Jan 2, 2011</li>
</ul>
</li>
<li><h2>Mar</h2>
<ul>
<li>Mar 2, 2011</li>
</ul>
</li>
<li><h2>Feb</h2>
<ul>
<li>Feb 9, 2011</li>
<li>Feb 20, 2011</li>
</ul>
</li>
</ul>
</li>
</ul>
【讨论】:
先生,你摇滚。很多。我总是忘记 list() 函数,但这很方便!谢谢,谢谢!以上是关于如何使用 PHP 将日期数组转换为 3 级嵌套列表的主要内容,如果未能解决你的问题,请参考以下文章
如何将树状的数组和对象的嵌套数据结构转换为具有计算/计数 id 和跟踪父 id 的项目列表?