2014-05-09 16 views
5

Tôi có cuộc gọi API. Cuộc gọi trả về XML, tôi chuyển đổi thành XML thành một mảng và sau đó sử dụng json_encode để gửi trả lời trong một cuộc gọi jsonp. Những gì tôi đang làm là làm việc nhưng API không cho phép tôi lọc theo trạng thái, lọc theo thời gian bắt đầu và kết thúc và cũng đảm bảo rằng phòng có sẵn.Mảng lọc hoặc XML có thời gian giữa thời gian bắt đầu và kết thúc

Thật điên rồ với một số cuộc gọi jsponp. Một lần nữa, những gì tôi có đang làm việc nhưng tôi cần phải tìm ra cách để lọc thêm một lần nữa với kết quả của tôi. Tôi đã trả lại trạng thái chính xác và ngày chính xác, nhưng tôi vẫn phải lọc ra lần. Nếu bây giờ là 10:29 sáng, tôi không muốn hiển thị các phòng đã đặt bắt đầu lúc 10:30 sáng vì nó không được đặt trước 10:30 sáng. Vì vậy, nếu thời gian hiện tại của tôi là 10:29, tôi cần phải lọc qua các sự kiện trong mảng của mình và chỉ hiển thị các sự kiện có thời gian bắt đầu và kết thúc có thời gian hiện tại ở giữa.

Đặt phòng từ 10-11 sáng nên ở trong mảng của tôi nhưng đặt phòng từ 2-4 giờ sẽ không hiển thị trong mảng của tôi. Như tôi đã nói mảng trước tiên là một tài liệu XML được trả về, sau đó là một mảng, sau đó JSON nên về mặt kỹ thuật tôi có thể sử dụng bất cứ thứ gì hoạt động để lọc. PHP để lọc trong XML, PHP để lọc mảng. Thậm chí Javascript cũng cho rằng tệp PHP đã sẵn sàng bằng cuộc gọi ajax của tôi.

Đây là mảng của tôi trước khi tôi chuyển nó thành JSON và trả về. Thời gian tôi lọc phải là TimeEventStart và TimeEventEnd. Tôi có thể sử dụng thời gian Javascript hiện tại hoặc thời gian hàm ngày PHP. Tôi có thể lọc mảng hoặc sử dụng một cái gì đó như XMLPath để lọc. Không chắc chắn những gì là hiệu quả nhất và sẽ làm việc tốt nhất.

$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" 
      ] 
     } 
     ] 
    } 
} 
; 

Mảng của tôi đang được trả về từ cuộc gọi SOAP bằng XML. Tôi lấy lại XML và sử dụng

$sxml = simplexml_load_string($xml) 

Sau đó, tôi đang sử dụng hàm có tên xmlToArray để đưa nó vào mảng được đăng.

$axml = xmlToArray($sxml); 

Đây là XML trước khi tôi chuyển đổi thành mảng và sau đó là 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> 
+0

Bạn có thể sử dụng Xpath để tìm nạp/lọc các nút XML. – ThW

+0

Bạn có thể cung cấp nguồn dữ liệu gốc (XML) hay không. Chuyển đổi nó thành một mảng có nghĩa là mất dữ liệu. – ThW

+0

Tôi tin rằng mảng là tốt. Tôi đã lấy ra một vài phần tử XML không cần thiết. Làm điều này khó khăn hơn với tôi là tôi là Eastern Time và dự án phải là Thái Bình Dương. Tôi tin rằng câu trả lời được cung cấp là đúng hướng, tôi chỉ cần có thời gian chính xác. – donlaur

Trả lời

4

Được rồi, vì vậy tôi đã viết một số hàm PHP để lọc ra những gì bạn yêu cầu.

Để so sánh ngày trong php, cách dễ nhất là chuyển đổi chúng thành thời gian Unix. Đó là chức năng đầu tiên. Unix time là thời gian trôi qua tính bằng giây kể từ ngày 1 tháng 1 năm 1970. Việc chuyển đổi chúng mang lại lợi thế cho bạn chỉ có thể sử dụng các toán tử < và> để so sánh hai lần.

Chức năng tiếp theo (nowBetween), xem liệu thời gian hiện tại có nằm giữa hai lần được thông qua ($ start và $ end) hay không.

Sau đó, tôi đã lấy chuỗi JSON của bạn (vì chúng tôi đã không thực sự nhìn thấy nguồn XML khi tôi viết bài này) và chuyển đổi nó thành mảng PHP. Chúng ta có thể chắc chắn nó là mảng, vì tham số thứ hai trong json_decode được đặt thành true.

Cuối cùng nhưng không kém phần quan trọng, tôi lặp qua tất cả các đặt chỗ trong phần "dữ liệu" của nội dung JSON, đọc thời gian GMTStart và GMTEnd và kiểm tra xem thời gian hiện tại có nằm giữa chúng hay không bằng cách sử dụng chức năng của chúng tôi. Nếu không như vậy, tôi sẽ xóa đặt chỗ khỏi mảng $ booking.

Kết quả chỉ là các đặt phòng có thời gian lưu trú chính xác. Sản lượng của tôi bây giờ trống, nhưng đó là vì ngày đặt phòng của bạn từ 2014-05-09 ... Khi tôi điều chỉnh thời gian hoạt động.

Tôi hy vọng câu trả lời này phù hợp với nhu cầu của bạn.

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]); 
    } 
} 
+0

Lưu ý rằng bạn có thể rút ngắn mã của mình bằng cách thay thế nếu xây dựng trong nowBetween bởi: "return ($ start <= $ now && $ end> ​​$ now);" nhưng tôi nghĩ rằng nó rõ ràng hơn theo cách này – JohannesB

+0

làm việc thông qua nó. Mảng của tôi thực sự được gán cho $ axml vì tôi đã cập nhật câu hỏi để hiển thị điều đó. – donlaur

+1

Tôi nghĩ rằng điều này đang làm việc cho tôi. Ví dụ XML Xpath khác cũng tốt. – donlaur

6

Bạn có thể lọc XML bằng Xpath. Xpath 1.0 không thể so sánh chuỗi, nhưng bạn cũng có thể đăng ký các hàm php.

Vì vậy, viết điều kiện trong PHP:

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

Tạo một tài liệu DOM và nạp XML. Tạo cá thể Xpath đăng ký không gian tên PHP và hàm.

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

Xác định một biểu thức XPath sử dụng các chức năng để lọc các nút phần tử dữ liệu:

// 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) 
); 

Fetch các nút phần tử dữ liệu sử dụng biểu thức 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); 

Demo: https://eval.in/151732

2

Vì tôi hiểu bạn sẽ nhận được một số bản ghi trongcủa bạnĐặt chỗ>? Sau đó, bạn có hai lựa chọn: nếu số lượng bản ghi luôn lớn - nhiều hơn một vài nghìn thì bạn nên sử dụng XPath để lọc dữ liệu TRƯỚC KHI chuyển đổi nó thành một nút sao chép từ XPath-> kết quả truy vấn sang tài liệu mới và chuyển đổi tài liệu này thành mảng. Nếu số lượng bản ghi nhỏ thì sẽ dễ dàng chuyển đổi chúng sau - chỉ cần sử dụng array_filter với một cuộc gọi lại tương tự như sau:

$filteredResult = array_filter($data, function($row) { 
    // parse dates and compare them.  
}); 

Và bạn sẽ nhận được mảng lọc.

Các vấn đề liên quan