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

don*_*aur 5 php xml jquery wsdl jsonp

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

几个jsponp调用让它变得疯狂.再一次,我所拥有的是工作,但我需要找到一种方法来再次使用我的结果过滤.我已经返回了正确的状态和正确的日期,但我仍然需要过滤掉时间.如果时间目前是上午10点29分,我不想显示从上午10点半开始预订的房间,因为直到上午10点半才开始预订.因此,如果我当前的时间是上午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"
            ]
         }
      ]
   }
}
;
Run Code Online (Sandbox Code Playgroud)

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

$sxml = simplexml_load_string($xml)
Run Code Online (Sandbox Code Playgroud)

然后我使用一个名为xmlToArray的函数将它放入发布的数组中.

$axml = xmlToArray($sxml);
Run Code Online (Sandbox Code Playgroud)

在转换为Array然后转换为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>
Run Code Online (Sandbox Code Playgroud)

ThW*_*ThW 6

您可以使用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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

定义使用该函数过滤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)
);
Run Code Online (Sandbox Code Playgroud)

使用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);
Run Code Online (Sandbox Code Playgroud)

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


Joh*_*esB 4

好的,所以我写了一些 PHP 函数,来过滤出您需要的内容。

要比较 php 中的日期,最简单的方法是将它们转换为 Unix 时间。这就是第一个函数的作用。Unix 时间是自 1970 年 1 月 1 日以来经过的时间(以秒为单位)。转换它们的优点是您可以简单地使用 < 和 > 运算符来比较两个时间。

下一个函数 (nowBetween) 检查当前时间是否在通过 ($start 和 $end) 给出的两个时间之间。

然后我获取了 JSON 字符串(因为当我写这篇文章时我们并没有真正看到 XML 源)并将其转换为 PHP 数组。我们可以确定它是数组,因为json_decode中的第二个参数设置为 true。

最后但并非最不重要的一点是,我循环遍历 JSON 内容的“数据”部分中的所有预订,读取 GMTStart 和 GMTEnd 时间,并使用我们的函数检查当前时间是否在它们之间。如果不是这样,那么我从 $bookings 数组中删除预订。

结果仅是具有正确停留时间的预订。我的输出现在是空的,但那是因为您的预订日期是从 2014 年 5 月 9 日开始...当我调整它的工作时间时。

我希望这个答案适合您的需求。

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]);
    }
}
Run Code Online (Sandbox Code Playgroud)