我有一个mysql时间戳列表。 我想制作一个html菜单,它有多年作为第一个LI和几个月作为嵌套LI。 例如:
2012 - > 十二月, 可以, 四月。 2011 - > 十一月, 一月。 2010 - > 四月, 游行, 二月。
如你所见,我希望菜单是一个多年的数组,几个月内,只是我数据库中的月份(和年)。
这很简单,但我无法实现如何执行此操作。 我正在查询我的所有时间戳并骑自行车,但是当我必须填充阵列时,我无法管理。
答案 0 :(得分:2)
你尝试过这样的事吗?
<?php
// this would've been pulled from mysql
$data = array(
array('date' => "2010-11-12 12:34:56", 'some' => 'data'),
array('date' => "2010-12-12 12:34:56", 'some' => 'data'),
array('date' => "2010-12-13 12:34:56", 'some' => 'data'),
array('date' => "2011-01-01 12:34:56", 'some' => 'data'),
);
$grouped = array();
foreach ($data as $row) {
$year = substr($row['date'], 0, 4);
$month = substr($row['date'], 6, 2);
$grouped[$year][$month][] = $row;
}
var_dump($grouped);
答案 1 :(得分:2)
你想要的SQL可能是这样的:
SELECT YEAR(date) AS year, MONTH(date) AS month, COUNT(*) AS entries FROM my_table
GROUP BY year,month ORDER BY year ASC, month ASC;
代码将是:
$previous_year = null;
foreach ($result_rows as $row) {
if ($previous_year == null || $row['year'] != $previous_year) {
if ($previous_year != null) {
echo '</ul>/li>';
}
echo '<li><span class="year">'.$row['year'].'</span><ul>';
$previous_year = $row['year'];
}
echo '<li>'.$row['month'].' ('.$row['entries'].')</li>';
}
if ($previous_year != null) {
echo '</ul></li>';
}
编辑:
替代PHP基于另一个答案,这更整洁:
$grouped = array();
foreach ($result_rows as $row) {
$grouped[$row['year']][$row['month']] = $row;
}
foreach ($grouped as $year => $months) {
echo "<li>$year";
echo "<ul>";
foreach ($months as $month => $row) {
echo "<li>$month (".$row['entries'].")</li>";
}
echo "</ul></li>";
}
答案 2 :(得分:1)
您必须使用GROUP BY 对查询进行分组,并在PHP中使用循环来创建合适的结构。
答案 3 :(得分:1)
轻微的伪代码。
$r = query(SELECT * FROM TBL_WHATEVER ORDER BY TS ASC);
$last_year = null;
while($row as mysql_fetch_assoc($r)){
$year = date('Y', $r['ts']);
if($year != $last_year){
echo $year;
$last_year = $year;
}else{
$month = 1;
while($month < 12){
echo date('F', $r['ts']);
}
}
}
关于它的帖子很多,就像这个: