创建一个约会数组,按日期排序(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)的主要内容,如果未能解决你的问题,请参考以下文章