2012-08-02 154 views
0

我正在尝试建立年份\月份归档。按年份和月份归档

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

我想在今年进行排序,并显示该月每一年(如果存在),并将其输出是这样的:

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”行做到这一点。这个话题,但它没有这样做的伎俩,我 任何帮助是极大的赞赏

+0

因为你想刚刚打印出来的每年一次,我可能会建议你将数据存储到一个数组,然后再输出,而阵列 – lusketeer 2012-08-02 15:40:25

+0

在循环或者,只需将'$ year'和'$ month'的前一个值存储在变量中,并且只在它们更改时才打印出来;你可能还想在查询中做一个'SELECT DISTINCT year,month',这样你就可以获得唯一的值,并且只需要检索你正在查找的字段。 – andrewsi 2012-08-02 15:46:29

回答

1

这应该起作用。当获取结果时,有时候是h andy将其重构为在迭代视图时易于使用。

$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>"); 
} 
+0

工程就像一个魅力!非常感谢! =) – Havihavi 2012-08-02 16:08:12

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
$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>"; 
} 
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>"; 
}