【问题标题】:How to create a archive list from an array of dates in php [duplicate]如何从php中的日期数组创建存档列表[重复]
【发布时间】:2012-04-11 13:26:12
【问题描述】:

我正在寻找以下格式的列表:

2012 (2) 
- January (1) 
- March (1) 
2011 (1) 
- March (1)

来自以下格式的日期数组:

Array
(
    [0] => Array
        (
            [year] => 2012
            [month] => 3
        )

    [1] => Array
        (
            [year] => 2012
            [month] => 1
        )

    [2] => Array
        (
            [year] => 2011
            [month] => 3
        )

)

此列表由以下查询提供,我也愿意接受有关如何返回数据的建议。这对我来说是最合乎逻辑的一步。

SELECT YEAR(post_date) as `year`, MONTH(post_date) as `month` FROM posts ORDER BY post_date DESC

我在这里陷入了死胡同。我不知道是我没有看到明显的东西,还是我把它弄得太复杂了,但我不知道从哪里开始。

【问题讨论】:

  • 我承认,这对我来说是一个可怕的问题。我应该表现出一些尝试,或者我首先自己努力解决这个问题。 坏柠檬!糟糕!

标签: php datetime archive


【解决方案1】:

假设您可能有多行具有相同的月/年:

# first sort into a 2-level array of post counts
$by_year = array();
$year_counts = array();
foreach ($rows as $row){
    $by_year[$row['year']][$row['month']]++;
    $year_counts[$row['year']]++;
}

# most recent year first!
krsort($by_year);

# and now iterate for display
foreach ($by_year as $year => $months){

    echo "<b>$year</b> ($year_counts[$year])<br />\n";
    echo "<ul>\n";

    # sort jan->dec
    ksort($months);
    foreach ($months as $month => $num){

        $name = date('F', mktime(0,0,0,$month,1,2010));
        echo "<li> $name ($num) </li>\n";
    }

    echo "</ul>\n";
}

这可以按照您的要求使用此输入数据:

$rows = array(
    array('year' => 2012, 'month' => 3),
    array('year' => 2012, 'month' => 3),
    array('year' => 2012, 'month' => 2),
    array('year' => 2011, 'month' => 1),
);

它输出这个:

2012 (3)
 * February (1)
 * March (2)
2011 (1)
 * January (1)

*更新以显示年份计数

【讨论】:

    【解决方案2】:

    然后您可以像这样构建数组:

    $someArray = Array();
    $query = mysql_query(...);
    
    while (($row = mysql_fetch_assoc($query)) != NULL)
    {
        $someArray[] = Array("year" => $row['year'], "month" => $row['month']);
    }
    

    在本例中,$someArray[] 表示“将此元素附加到数组中”。

    【讨论】:

    • 看到问题是我在将数组转换为
        列表时也遇到了问题,另一位用户慷慨地向我提供了pastie.org/3681331,但我还没有走远。跨度>
    【解决方案3】:

    我猜你想创建一个每月有多少文章的列表,按年份分层显示?

    Neil 的回答显示了如何从数据库中获取结果。如果您以此为起点,那么您可以遍历数组并使用计数构造您的列表,然后打印出该列表。

    您还可以让 MySQL 使用 group by 语句计算每月的帖子数。

    select year(post_date) as `year`, month(post_date) as `month`, count(*) as `count`
    from posts
    group by concat(year(post_date),month(post_date))
    order by post_date desc
    

    然后使用类似于 Neil 的代码,但为了以后方便而制作了一些嵌套数组,你会得到:

    $counts = array();
    $query = mysql_query(...);
    
    while (($row = mysql_fetch_assoc($query)) != null) {
        $counts[ $row['year'] ] = array("month" => $row['month'], 'count' => $row['count']);
    }
    

    然后将其打印为 HTML:

    echo "<ul>";
    foreach($counts as $year => $months) {
        echo "<li>$year <ul>"
        foreach($months as $row) {
            $month = name_for_month($row['month']); //TODO: make this method
            echo "<li>$month ({$row['count']})</li>";
        }
        echo "</ul></li>";
    }
    echo "</ul>";
    

    嗯,你还有下一年的总数。好吧,您可以添加如下内容:

    $yearSums = array();
    $counts = array();
    $query = mysql_query(...);
    
    while (($row = mysql_fetch_assoc($query)) != null) {
        $counts[ $row['year'] ] = array("month" => $row['month'], 'count' => $row['count']);
        $yearSums[ $row['year'] ] += $row['count'];
    }
    

    然后将这些数据也打印出来。

    免责声明:不保证这是好的代码,这只是您如何做到这一点的一个简单示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 2022-01-13
      相关资源
      最近更新 更多