从时间戳填充多维数组


populating multidimensional array from timestamp

我有一个mysql时间戳列表。我想生成一个 html 菜单,它有年作为第一个 LI,几个月作为嵌套的 LI。例如:

2012年-> 十二月 五月 四月。2011年->年 十一月 一月。2010年-> 四月 三月 二月。

如您所见,我希望菜单是一系列年份和几个月内,只是我数据库中的月份(和年份)。

这当然很简单,但我无法意识到如何执行此操作。我正在查询我所有的时间戳并循环它们,但是当我必须填充数组时,我无法管理。

你想要的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>";
}

你试过这样的事情吗?

<?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);

您必须使用 GROUP BY 对查询进行分组,并在 PHP 中使用循环来创建合适的结构。

在轻微的 peusdo 代码中。

$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']);
       }
    }
}

有很多关于它的帖子,比如这个:

PHP:循环浏览日期范围内的所有月份?