按年和月归档

时间:2012-08-02 15:37:02

标签: php mysql datetime group-by archive

我正在尝试建立一年/月的档案。

它拒绝输出我想要的东西所以我希望你们中的一个人可能会把我推向正确的方向。

我想按年份排序,并显示每年的月份(如果存在)并输出如下:

2012
 - June
 - August 
2011
 - July

我的代码是:

$query = "SELECT * FROM article WHERE full_name ='$safe_name' group by year, month";
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_assoc($result)) {
$year = $row['year'];
$month = $row['month'];
echo "<ul class='year'><li><a>{$year}</a>";
echo "<ul class='months'><li><a>{$month}</a></li></ul>
</li></ul>";
}

但它输出:

2012
 - june

2012
 - august

2011
 - july

当我只按年份分组时,它会输出:

2012
 - june
2011
 - july

我有一个“date_posted”行,即datetime(yyyy-mm-dd 00:00:00)。 最重要的是,我有1行和1年(我知道这是愚蠢的,但我不知道如何通过使用“date_posted”行来做到这一点。

我已经阅读了关于这个主题的一些帖子,但它并没有为我做的伎俩。 非常感谢任何帮助!

4 个答案:

答案 0 :(得分:1)

您需要使用简单的“状态”机器来检测一年何时发生变化:

$previous_year = null;
$frist = true;
echo "<ul>"
while($row = mysql_fetch_assoc($result)) {
   if ($row['year'] != $previous_year) {
     // got a new year
     if (!$frist) {
        echo "</ul></li>"; // only close a previous list if there IS a previous list
        $frist = false;
     }
     echo "<li class="year">$row[year]\n<ul>";
     $previous_year = $row['year'];
   }
   echo "<li class="month">$row['month']</li>";
}

答案 1 :(得分:1)

$temp_year = 0;
while($row = mysql_fetch_assoc($result)) {
    $year = $row['year'];
    $month = $row['month'];
    if( $temp_year != $year )
    {
        if( $temp_year > 0 )
            echo "</li></ul>";
        $temp_year = $year;
        echo "<ul class='year'><li><a>{$year}</a>";
    }
    echo "<ul class='months'><li><a>{$month}</a></li></ul>";
}

答案 2 :(得分:1)

这应该有效。在获取结果时,有时重新构造它以便在迭代视图时可以轻松使用。

$query = "SELECT * FROM article WHERE full_name ='$safe_name' group by year, month";
$result = mysql_query($query) or die(mysql_error());

while($row = mysql_fetch_assoc($result)) {

   // Get data
   $year = $row['year'];
   $month = $row['month']

   // Structure it
   $archive[$year][] = $month;

}

// Display data
foreach($archive as $year => $months)
{
   // Show year
   echo "<ul class='year'><li><a>{$year}</a>";

   // Month container
   echo "<ul class='months'>"

   // Get months
   foreach($months as $month)
   {
     echo("<li><a>{$month}</a></li>"; 
   }

   // Close Month/Year containers
   echo("</ul></li></ul>");
}

答案 3 :(得分:1)

试一试

$storage_array = array();
while($row = mysql_fetch_assoc($result)) {
   $year = $row['year'];
   $month = $row['month'];
   $storage_array[$year][] = $month;
}
foreach ($storage_array as $year => $month_array){
   echo "<ul class='year'><li><a>{$year}</a>";
   foreach ($month_array as $month){
      echo "<ul class='months'><li><a>{$month}</a></li></ul>";
   }
   echo "</li></ul>";
}