2016-01-12 138 views
1

我正在使用來自投稿人的API用於我的酒店預訂引擎。每當我需要從他的系統中獲得一些信息時,我執行CURL並且我得到XML中的響應。然後我申請json_decode(json_encode(simplexml_load_string($response)), true) ,我得到數組中的響應。到目前爲止這麼好,但有一個具體的問題。同一個函數返回的XML並不總是相同的格式。它取決於請求的參數。我將用一個具體的例子來說明這一點。 當我需要獲得我的房間/房間的可用性時,我發送了一段時間的請求。這裏有4種不同的情況。在同一個多維數組中轉換一個不同的多維數組

  1. 1室 - 19天
  2. 室1 - 多天
  3. 多個房間 - 19天
  4. 多個房間 - 多天

在情況(1)數組是像這:enter image description here

在情況(2)陣列是這樣的: enter image description here

在情況(3)的陣列是這樣的: enter image description here

在情況(4)陣列是這樣的: enter image description here

正如你可以看到,如果有1個房間,有沒有0鍵作爲索引,並且信息看起來像「1級上」。幾天的情況也是如此。如果你要求超過1天,那麼所有的日子都有它們的索引(0,1,2等)。

現在的問題是:有沒有辦法將每個響應轉換爲數組,如情況4?

我的意思是如果有1個房間,將它的信息放在RoomAvailability ['0']下。如果還有更多,請將它們放置爲像RoomAvailability ['1'],RoomAvailability ['2']等... DayAvailability的相同之處。如果有一天將當天的信息置於DayAvailability ['0']之下。很多天? DayAvailability [「1」],DayAvailability [「2」]等等 有了這個麻煩我可以做些什麼來檢查是否有很多房間的唯一的事情就是:

if (isset($response['RoomsAvailability']['RoomAvailability']['0'])) { 
    //Do staff 
} 

但是,這是非常糟糕!如果有1個房間或50個,1天或30個,我不想浪費時間和條件!

Any1能幫忙嗎?

回答

0

我回答我的問題,因爲我發現我的問題是什麼樣的影響。 在這一行json_decode(json_encode(simplexml_load_string($response)), true)如果一個節點有孩子,這個數組就像$array[0][something], $array[1][something] etc ......但是如果只有一個孩子,那麼這個數組就像沒有0鍵的$array[something]!那完全出乎意料!

經過大量的搜索,似乎沒有抽象和正確的方法將任何XML轉換爲php數組,保留每個節點的屬性並保持與XML相同的結構。如果我錯了,請糾正我。

我決定用SimpleXMLElementphp.net link,非常簡單易用。

0

只是做一個預檢查,如果他們是數組,如果沒有,將其封裝在一個數組中。

首先做的主數組(在這種情況下,第二RoomsAvailability) 數組

if(array_key_exists('@attributes', ($response['RoomsAvailability']['RoomAvailability'])) 
{ 
    $response['RoomsAvailability']['RoomAvailability'] = [$response['RoomsAvailability']['RoomAvailability']]; 
} 

之後,你需要運行的每個房間,做同樣的天

foreach($response['RoomsAvailability']['RoomAvailability'] as &$item) 
{ 
    if(array_key_exists('DayAvailability', $item)) 
    { 
    $item = [$item]; 
    } 
} 

Full code:

// check if the base room availability is a single room, if it is convert into an array 
if(array_key_exists('@attributes', ($response['RoomsAvailability']['RoomAvailability'])) 
{ 
    $response['RoomsAvailability']['RoomAvailability'] = [$response['RoomsAvailability']['RoomAvailability']]; 
} 

// now do the same for all the days in rooms 
foreach($response['RoomsAvailability']['RoomAvailability'] as &$item) 
{ 
    if(array_key_exists('DayAvailability', $item)) 
    { 
    $item = [$item]; 
    } 
} 

// now do you stuff 

注意:在foreach我已經添加了&&$item,使在foreach的變化確實有外面的它