创建一个约会数组,按日期排序(MySQL/PHP)

Posted

技术标签:

【中文标题】创建一个约会数组,按日期排序(MySQL/PHP)【英文标题】:Creating an array of appointments, sorted by date (MySQL/PHP) 【发布时间】:2012-09-15 10:10:31 【问题描述】:

我正在建立一个用户可以预约的网站。

我目前正在为该项目构建一个 javascript 应用程序,用户可以在其中从日历中选择一个日期并查看可用的约会。当我构建日历时,我需要按可用的约会为日期着色(例如,如果有的话,则为绿色)。

为了做到这一点,我需要迭代一个包含所有可用预订的 javascript 数组。目前它看起来像这样:

[对象、对象、对象...]

对象是一个包含约会信息的 javascript 对象。这是为 JSON 提供服务的 php 服务:

<?php
require_once('../include/dbconnect.php');

$sql = "SELECT appointment.example,... 
person.example,... 
FROM appointment, person
WHERE appointment.reserved=0";

$stmt = $db->prepare($sql);
$stmt->execute();

$array = array();
while($row = $stmt->fetchObject())
array_push($array, $row);


echo json_encode($array);
?>

所以这终于把我们带到了这个问题上。

为了更轻松地扫描 javascript 数组,我需要一个数组/对象,其中包括按日期排列/排序的约会。然后,当我创建一个表示日期的元素时,我可以检查对象是否匹配数据。像这样的数据:


15.09.2012 : Object,
16.09.2012 : Object
    appointment1 : Object,
    appointment2 : Object
 

在数据库中,约会有一个属性“日期”,该属性当前是一个类似于“16.09.2012”的字符串。我是否也应该将其更改为 unix 时间戳

我应该如何更改 PHP 服务以输出一个 JSON 对象,其中包括按日期提交的约会?

【问题讨论】:

为什么在你的sql请求中,没有添加ORDER BY appointment.date_field 【参考方案1】:

一个可能的解决方案是在 php 中使用关联数组:

$assoc = array("key" => "value");

当您获取数据库记录时,您可以执行以下操作:

$array = array();
while($row = $stmt->fetchObject())
$array[$row -> date] = $row;


echo json_encode($array);

对于排序,您可以使用ksort (http://php.net/manual/en/function.ksort.php) php 函数,对数组进行按键排序。

现在您将拥有一个 Javascript 对象而不是 Javascript 数组。 现在您可以在 javascript 循环 (How to Loop through plain JavaScript object with objects as members?) 中使用 for .. 迭代对象

【讨论】:

谢谢,这正是我想要的。太好了! 我注意到了一些事情。我添加了两个相同日期的约会。上面的循环每天只增加一个约会。如果两个或多个约会共享相同的日期,我想我必须添加一个 if/else 条件来创建一个子数组? 嗯,你可以按以下格式存储:约会日期 => 约会数组并检查密钥是否存在 - 添加到数组中,否则,创建新数组并插入约会【参考方案2】:

您可以尝试如下:

$sql = "SELECT appointment.example,... 
person.example,... 
FROM appointment, person
WHERE appointment.reserved=0 ORDER BY appointment.date_field ASC";

$stmt = $db->prepare($sql);
$stmt->execute();

$array = array();
while($row = $stmt->fetchObject())
$array[$row->date_field][]=$row;
array_push($array, $row);


echo json_encode($array);
?>

【讨论】:

【参考方案3】:

您不需要构造由日期键组成的对象。而是:

    在当前结构中包含日期并按日期对数组进行排序:

    <?php
    require_once('../include/dbconnect.php');
    
    $stmt = $db->query('
      SELECT   DATE(appointment.datetime) AS date,
               appointment.datetime,
               appointment.reserved,
               appointment.example,     -- do you really want to send sensitive
               person.example           -- data about appointments to the browser?
      FROM     appointment JOIN person ON ...
      WHERE    appointment.reserved = 0 -- should this be = 1?
      ORDER BY appointment.datetime
    ');
    
    echo json_encode($stmt->fetchAll(PDO::FETCH_OBJ));
    ?>
    

    然后在遍历数组时跳过匹配的日期:

    // loop over all dates displayed in calendar
    for (
      currentDate  = startDate, i = 0;
      currentDate <= endDate;
      currentDate.setDate(currentDate.getDate() + 1)
    )
    
      // determine whether the current date is booked
      // and advance pointer to next date in array
      for (
        booked = false;
        i < arr.length && arr[i].date == currentDate;
        ++i
      ) booked |= arr[i].reserved;  // or just `booked = true` if query
                                    // returned only booked appointments
    
      // apply appropriate CSS to currentDate
      // ...
    
    

您甚至可以考虑通过首先返回仅包含预订日期的 JSON 数组来减少客户端开销(在这种情况下,上面的内部循环可以替换为简单的 if 语句):

SELECT   DISTINCT DATE(appointment.datetime) AS date
FROM     appointment JOIN person ON ...
WHERE    appointment.reserved = 0 -- should this be = 1?
ORDER BY date

然后,一旦用户选择了一个日期,就对该日期的预订进行进一步查询:

SELECT   appointment.datetime
FROM     appointment JOIN person ON ...
WHERE    appointment.reserved = 0 -- should this be = 1?
     AND DATE(appointment.datetime) = ?
ORDER BY appointment.datetime

【讨论】:

我要感谢你,但我需要约会对象,因为我在用户选择了免费约会的一天后使用它(列出当天可用的约会)。这也是我只获取未预约的约会的原因。在不同的情况下,您的设计可能会在以后派上用场。

以上是关于创建一个约会数组,按日期排序(MySQL/PHP)的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 查询获取日期时间紧跟当前日期时间之后的记录

按日期排序对象数组[重复]

按日期排序数组 - javascript [重复]

MySQL PHP插入新行,其中rowNum列值始终按日期和时间按时间顺序排列

按日期排序数组中的对象

使用数组中的日期按日期对 UITableview 进行排序