我有一个API调用。调用返回XML,我将XML转换为数组,然后使用json_encode在jsonp调用中发回响应。我正在做的是工作,但API不允许我按状态过滤,按开始和结束时间过滤,并确保房间可用。
几个jsponp调用让它变得疯狂。同样,我所做的是有效的,但我需要找到一种方法来再次过滤我的结果。我已经返回了正确的状态和日期,但是我仍然需要过滤掉时间。如果目前的时间是上午10:29,我不想显示10:30开始的预订房间,因为直到10:30才被预订。因此,如果我的当前时间是10:29 am,我需要过滤数组中的事件,只显示具有开始和结束时间且当前时间介于两者之间的事件。
上午10-11点的预订应该留在我的数组中,但下午2-4点的预订不应该显示在我的数组中。正如我所说,数组首先是返回的XML文档,然后是数组,然后是JSON,所以从技术上讲,我可以使用任何有效的过滤方法。PHP过滤XML, PHP过滤数组。甚至Javascript一旦PHP文件准备好了我的ajax调用。
这是我的数组之前,我把它变成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);
这是我转换成数组之前的XML,然后是JSON。
<?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');
定义使用函数过滤Data元素节点的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表达式获取Data元素节点:
$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函数,来过滤你需要的东西。
要比较php中的日期,最简单的方法是将它们转换为Unix时间。这就是第一个函数的作用。Unix时间是自1970年1月1日以来以秒为单位经过的时间。转换它们的好处是你可以简单地使用<和>操作符用于比较两次。和>
下一个函数(nowBetween),检查当前时间是否在($start和$end)给出的两个时间之间。
然后我把你的JSON字符串(当我写这篇文章的时候我们并没有真正看到XML源代码),并把它转换成PHP数组。我们可以确定它是数组,因为json_decode中的第二个参数被设置为true。
最后但并非最不重要的是,我循环遍历JSON内容的"data"部分中的所有预订,读取GMTStart和GMTEnd时间,并使用我们的函数检查当前时间是否在它们之间。如果没有,则从$booking数组中删除预订。
结果是只有正确时间停留的预订。我的输出现在是空的,但那是因为您的预订日期是2014-05-09…当我调整时间时,它起作用了。
我希望这个答案能满足你的需要。
function convertDateTime($datetime) {
//FORMAT IS date("YYYY-MM-DDThh:mm:ss")
$datetime = str_replace("T"," ",$datetime);
return date("U",strtotime($datetime));
}
function nowBetween($start,$end) {
$now = gmdate("U");
$start = convertDateTime($start);
$end = convertDateTime($end);
if ($start <= $now && $end > $now)
{
return true;
}
else
{
return false;
}
}
$bookings = '{"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-9T00: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"]}]}}';
$bookings = json_decode($bookings,true);
foreach ($bookings["Bookings"]["Data"] as $index=>$arrContent)
{
if (!nowBetween($arrContent["GMTStartTime"][0],$arrContent["GMTEndTime"][0]))
{
unset($bookings["Bookings"]["Data"][$index]);
}
}
据我所知,您将在您的<预订> ?然后你有两个选择:如果记录的数量总是非常大——超过几千,那么你应该在将数据转换为数组之前使用XPath过滤数据——从XPath->查询结果复制节点到新文档,并将该文档转换为数组。如果记录的数量很少,那么转换它们更容易-只需使用array_filter和类似的回调:预订>
$filteredResult = array_filter($data, function($row) {
// parse dates and compare them.
});
你会得到一个过滤数组