2016-01-12 137 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的变化确实有外面的它