【问题标题】:Best way to display a list of events by month按月显示事件列表的最佳方式
【发布时间】:2010-05-22 00:04:35
【问题描述】:

我有一个 mySQL 事件表,并希望使用 PHP 在列表中显示它们。很简单,只是我只想显示一次月份名称,例如:

2010 年 5 月
12 日,晚上 7 点。活动 1 - 活动一说明
15 日下午 5 点 30 分。事件 2 - 事件 2 描述

2010 年 6 月
9 日,晚上 7 点。活动 1 - 活动一说明
11 日下午 5 点 30 分。事件二——事件二描述

我是 SQL 和 PHP 的新手。我可以想到一种方法来做到这一点。这将涉及选择按日期分组的所有记录,然后遍历所有记录,每次比较月/年值和第一次月/年不匹配时,在我的 HTML 表中打印一个新的标题行。我不敢相信这是最好或最有效的方式。对新手有什么想法吗?我确信我的方法会奏效,但它充其量是不优雅的,最坏的情况是处理器密集型。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    这就是我要做的(几乎是你所概述的):

    1. 从 MySQL 中获取所有这些。让 MySQL 为您排序(在 MySQL 的 select 语句中排序日期很简单)。
    2. 在您的 PHP 脚本中,循环遍历您的日期,每次通过,使用正则表达式或 PHP 时间/日期函数从日期中提取月份。如果月份与上个月不同(在循环外有一个变量,名为 $currentMonth),将其打印为标题,打印日期,然后设置 $currentMonth 变量。

    【讨论】:

    • 如果你不介意我问,为什么要使用正则表达式(而不是 DateTime 类 php.net/manual/en/class.datetime.php)?
    • 是的,这就是我的意思,但不确定这是否被认为是好的做法。
    【解决方案2】:

    这将是我快速而肮脏的方法。

    假设您在数据库中以 UNIX 时间戳格式保存事件时间。 (如果没有,简单的 strtotime($datetime) 将为您提供该格式)。

    当您从数据库中选择事件列表(并且很可能按日期/时间排序,升序)时,循环遍历列表。

    $events = array();
    
    foreach ($rows as $row)
    {
        $month_year = strtotime(date("Y-m-01", $row['unix_timestamp']));
        $events[$month_year][] = $row;
    }
    

    然后,当你想打印出列表时:

    foreach ($events as $month_year => $month_events)
    {
        echo date("F Y", $month_year);
        foreach ($month_events as $event)
        {
            printf("%s. %s", date("jS, g:i a", $event['unix_timestamp']), $event['description']);
        }
    }
    

    如果分钟 == 0,您可以在其中添加更多逻辑以使用“jS g a”日期格式。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多