gpt4 book ai didi

php - 使用开始时间和结束时间之间的时间过滤数组或 XML

转载 作者:可可西里 更新时间:2023-11-01 13:41:22 25 4
gpt4 key购买 nike

我有一个 API 调用。调用返回 XML,我将 XML 转换为数组,然后使用 json_encode 在 jsonp 调用中发回响应。我正在做的是工作,但 API 不允许我按状态过滤,按开始和结束时间过滤,也不允许我确保房间可用。

它会因多次 jsponp 调用而变得疯狂。同样,我所拥有的正在工作,但我需要想出一种方法来再次过滤我的结果。我已经返回了正确的状态和正确的日期,但我仍然需要过滤掉时间。如果当前时间是上午 10:29,我不想显示从上午 10:30 开始的预订房间,因为它直到上午 10:30 才被预订。因此,如果我的当前时间是上午 10:29,我需要过滤我的数组中的事件,并且只显示具有开始时间和结束时间且当前时间介于两者之间的事件。

上午 10 点到 11 点的预订应该保留在我的数组中,但下午 2 点到 4 点的预订不应该显示在我的数组中。正如我所说,数组首先是一个返回的 XML 文档,然后是一个数组,然后是 JSON,所以从技术上讲,我可以使用任何有效的方法来过滤。 PHP过滤XML,PHP过滤数组。甚至 Javascript 也曾经通过我的 ajax 调用准备好 PHP 文件。

这是我将其转换为 JSON 并返回之前的数组。我过滤的时间应该是TimeEventStart和TimeEventEnd。我可以使用当前的 Javascript 时间或 PHP 日期函数时间。我可以过滤数组或使用 XMLPath 之类的东西来过滤。不确定什么是最有效的并且效果最好。

$axml = Array{
"Bookings":{
"Data":[
{
"BookingDate":[
"2014-05-09T00:00:00"
],
"RoomDescription":[
"Room06"
],
"TimeEventStart":[
"2014-05-09T14:00:00"
],
"TimeEventEnd":[
"2014-05-09T14:30:00"
],
"EventName":[
"Jake Long"
],
"SetupTypeDescription":[
"(none)"
],
"ReservationID":[
"137"
],
"OpenTime":[
"1900-01-01T00:00:00"
],
"CloseTime":[
"1900-01-01T00:00:00"
],
"EventTypeDescription":[
[

]
],
"BookingID":[
"709"
],
"TimeBookingStart":[
"2014-05-09T14:00:00"
],
"TimeBookingEnd":[
"2014-05-09T14:30:00"
],
"GMTStartTime":[
"2014-05-09T18:00:00"
],
"GMTEndTime":[
"2014-05-09T18:30:00"
],
"TimeZone":[
"ET"
],
"RoomCode":[
"R06"
],
"Room":[
"Room 6"
],
"RoomID":[
"34"
],
"StatusID":[
"3"
],
"EventTypeID":[
"0"
],
"DateAdded":[
"2014-05-09T13:47:29.087"
],
"DateChanged":[
"2014-05-09T13:47:29.087"
],
"ChangedBy":[
"Admin"
]
},
{
"BookingDate":[
"2014-05-09T00:00:00"
],
"RoomDescription":[
"Room06"
],
"TimeEventStart":[
"2014-05-09T18:00:00"
],
"TimeEventEnd":[
"2014-05-09T20:00:00"
],
"EventName":[
"Rob Brown"
],
"SetupTypeDescription":[
"(none)"
],
"ReservationID":[
"142"
],
"OpenTime":[
"1900-01-01T00:00:00"
],
"CloseTime":[
"1900-01-01T00:00:00"
],
"EventTypeDescription":[
[

]
],
"BookingID":[
"714"
],
"TimeBookingStart":[
"2014-05-09T18:00:00"
],
"TimeBookingEnd":[
"2014-05-09T20:00:00"
],
"GMTStartTime":[
"2014-05-09T22:00:00"
],
"GMTEndTime":[
"2014-05-10T00:00:00"
],
"TimeZone":[
"ET"
],
"RoomCode":[
"R06"
],
"Room":[
"Room 6"
],
"RoomID":[
"34"
],
"StatusID":[
"3"
],
"EventTypeID":[
"0"
],
"DateAdded":[
"2014-05-09T14:58:55.71"
],
"DateChanged":[
"2014-05-09T14:58:55.71"
],
"ChangedBy":[
"Admin"
]
},
{
"BookingDate":[
"2014-05-09T00:00:00"
],
"StartBookingDate":[
"2014-05-09T00:00:00"
],
"RoomDescription":[
"Room06"
],
"TimeEventStart":[
"2014-05-09T11:00:00"
],
"TimeEventEnd":[
"2014-05-09T12:00:00"
],
"EventName":[
"Jimmy James"
],
"SetupTypeDescription":[
"(none)"
],
"ReservationID":[
"141"
],
"OpenTime":[
"1900-01-01T00:00:00"
],
"CloseTime":[
"1900-01-01T00:00:00"
],
"EventTypeDescription":[
[

]
],
"BookingID":[
"713"
],
"TimeBookingStart":[
"2014-05-09T11:00:00"
],
"TimeBookingEnd":[
"2014-05-09T12:00:00"
],
"GMTStartTime":[
"2014-05-09T15:00:00"
],
"GMTEndTime":[
"2014-05-09T16:00:00"
],
"TimeZone":[
"ET"
],
"RoomCode":[
"R06"
],
"Room":[
"Room 6"
],
"RoomID":[
"34"
],
"StatusID":[
"1"
],
"EventTypeID":[
"0"
],
"DateAdded":[
"2014-05-09T14:58:15.17"
],
"DateChanged":[
"2014-05-09T14:58:15.17"
],
"ChangedBy":[
"Admin"
]
}
]
}
}
;

我的数组是从 XML 中的 SOAP 调用返回的。我正在取回 XML 并使用

$sxml = simplexml_load_string($xml)

然后我使用名为 xmlToArray 的函数将其放入数组中。

$axml = xmlToArray($sxml);

这是我转换为数组和 JSON 之前的 XML。

<?xml version="1.0" encoding="utf-8"?><Bookings>
<Data>
<BookingDate>2014-05-13T00:00:00</BookingDate>
<StartBookingDate>2014-05-13T00:00:00</StartBookingDate>
<RoomDescription>Room 06</RoomDescription>
<TimeEventStart>2014-05-13T10:00:00</TimeEventStart>
<TimeEventEnd>2014-05-13T10:30:00</TimeEventEnd>
<EventName>Jake Long</EventName>
<ReservationID>159</ReservationID>
<ClosedAllDay>false</ClosedAllDay>
<OpenTime>1900-01-01T00:00:00</OpenTime>
<CloseTime>1900-01-01T00:00:00</CloseTime>
<BookingID>731</BookingID>
<TimeBookingStart>2014-05-13T10:00:00</TimeBookingStart>
<TimeBookingEnd>2014-05-13T10:30:00</TimeBookingEnd>
<GMTStartTime>2014-05-13T14:00:00</GMTStartTime>
<GMTEndTime>2014-05-13T14:30:00</GMTEndTime>
<RoomCode>R09</RoomCode>
<Room>Room 9</Room>
<RoomID>37</RoomID>
<StatusID>3</StatusID>
<DateAdded>2014-05-13T08:38:22.36</DateAdded>
<DateChanged>2014-05-13T08:38:22.36</DateChanged>
</Data>
</Bookings>

最佳答案

您可以使用 Xpath 过滤 XML。 Xpath 1.0 无法比较字符串,但您也可以注册 php 函数。

所以用PHP写条件:

function isBetween($current, $min, $max) {
$current = strtotime($current.'Z');
$min = strtotime($min.'Z');
$max = strtotime($max.'Z');
return $current >= $min && $current <= $max;
}

创建 DOM 文档并加载 XML。创建 Xpath 实例注册 PHP 命名空间和函数。

$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);
$xpath->registerNamespace("php", "http://php.net/xpath");
$xpath->registerPhpFunctions('isBetween');

定义一个 Xpath 表达式,使用该函数来过滤数据元素节点:

// use gmtime() for current time
$now = strtotime('2014-05-13T14:00:00Z');
$expression = sprintf(
'/Bookings/Data[
php:function("isBetween", "%s", string(GMTStartTime), string(GMTEndTime))
]',
gmdate('Y-m-d\\TH:i:s', $now)
);

使用 Xpath 表达式获取数据元素节点:

$result = [];
foreach($xpath->evaluate($expression) as $dataNode) {
$record = [];
// convert the matching data into a record array
foreach ($xpath->evaluate('*', $dataNode) as $childNode) {
$record[$childNode->localName] = $childNode->nodeValue;
}
$result[] = $record;
}
var_dump($result);

演示:https://eval.in/151732

关于php - 使用开始时间和结束时间之间的时间过滤数组或 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23574055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com