1

我有一系列按时间降序排列的日期。当我遍历它们时,目前我正在拆分字符串并使用当前年份和月份并将其与上一个月份进行比较。

这是所需的输出(示例):

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

上面的代码有一些明显的问题。我不断接近,但无法完全理解逻辑。请协助并非常感谢您!

4

2 回答 2

2

这就是我将如何做到的。创建所需的输出数据结构,然后对其进行迭代以打印出 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;


}
于 2012-12-21T07:28:34.373 回答
0

与 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>
于 2012-12-21T07:42:04.033 回答