2013-07-02 142 views
4

請先閱讀下面的粗體行,然後再評論這可能是重複的。這與SimpleXML無關。將多維數組轉換爲XML

讓我首先展示如何佈置XML。請忽略名稱空間:

<hot:SearchHotels> 
    <hot:request> 
     <hot1:Destination>?</hot1:Destination> 
     <hot1:HotelCityName>?</hot1:HotelCityName> 
     <hot1:HotelLocationName>?</hot1:HotelLocationName> 
     <hot1:HotelName>?</hot1:HotelName> 
     <hot1:CheckIn>?</hot1:CheckIn> 
     <hot1:CheckOut>?</hot1:CheckOut> 
     <hot1:RoomsInformation> 
      <!--Zero or more repetitions:--> 
      <hot1:RoomInfo> 
       <hot1:AdultNum>?</hot1:AdultNum> 
       <hot1:ChildNum>?</hot1:ChildNum> 
       <!--Optional:--> 
       <hot1:ChildAges> 
       <!--Zero or more repetitions:--> 
       <hot1:ChildAge age="?"/> 
       </hot1:ChildAges> 
      </hot1:RoomInfo> 
     </hot1:RoomsInformation> 
     <hot1:MaxPrice>?</hot1:MaxPrice> 
     <hot1:StarLevel>?</hot1:StarLevel> 
     <hot1:AvailableOnly>?</hot1:AvailableOnly> 
     <hot1:PropertyType>?</hot1:PropertyType> 
     <hot1:ExactDestination>?</hot1:ExactDestination> 
    </hot:request> 
    </hot:SearchHotels> 

在hot1下的通知:RoomsInformation裏面有RoomInfo。我應該能夠發送多個RoomInfo節點。 但我正在使用PHP類將數組轉換爲通過SOAP提交的此對象。

這裏是我的陣列之前,它被轉換爲對象:

$param = array(
      "Destination" => $destcode, 
      "HotelCityName" => $city, 
      "HotelLocationName" => "", 
      "HotelName" => "", 
      "CheckIn" => date("Y-m-d", strtotime($checkin)), 
      "CheckOut" => date("Y-m-d", strtotime($checkout)), 
      "RoomsInformation" => array (
       "RoomInfo" => array(
         "AdultNum" => 2, 
         "ChildNum" => 1, 
         "ChildAges" => array(
          "ChildAge" => array(
           "age"=>11 
          ) 
         ) 
        ), 
       "RoomInfo" => array(
         "AdultNum" => 1, 
         "ChildNum" => 0, 
         "ChildAges" => array(
          "ChildAge" => array(
           "age"=>0 
          ) 
         ) 
        ) 
      ), 
      "MaxPrice" => 0, 
      "StarLevel" => 0, 
      "AvailableOnly" => "false", 
      "PropertyType" => "NotSet", 
      "ExactDestination" => "false" 
     ); 

$param = arrayToObject($param) ; 
$obj = new stdClass(); 
$obj->request=$param; 
$result = $test->SearchHotels($obj) ; 

的問題是轉換爲對象之後,只有1 RoomInfo和最後一個。我的想法是因爲RoomsInformation數組有2個相同的KEY名稱。那我該如何做這項工作?

爲了您的信息,這裏是SOAP I類使用和arrayToObject功能:

http://pastebin.com/SBUN0FAF

+3

[如何將數組轉換爲SimpleXML](http://stackoverflow.com/q/1397036/1503018) – sectus

+1

如果使用SOAP,那麼php內置的SoapClient可以處理數組 – Fracsi

+2

您可以'噸,而不是該陣列。不管你有多少個'RoomsInformation'條目,如果他們有相同的密鑰,他們確實只有一個。 –

回答

7

的問題是,你的陣列是無效的,因爲你,因爲重複鍵的懷疑。解決這個問題的方法之一是包裝每個「RoomInfo」在自己的數組,像這樣:

$param = array(
    "Destination" => $destcode, 
    "HotelCityName" => $city, 
    "HotelLocationName" => "", 
    "HotelName" => "", 
    "CheckIn" => date("Y-m-d", strtotime($checkin)), 
    "CheckOut" => date("Y-m-d", strtotime($checkout)), 
    "RoomsInformation" => array (
     array(
      "RoomInfo" => array(
       "AdultNum" => 2, 
       "ChildNum" => 1, 
       "ChildAges" => array(
        "ChildAge" => array(
         "age"=>11 
        ) 
       ) 
      ), 
     ), 
     array(
      "RoomInfo" => array(
       "AdultNum" => 1, 
       "ChildNum" => 0, 
       "ChildAges" => array(
        "ChildAge" => array(
         "age"=>0 
        ) 
       ) 
      ) 
     ) 
    ), 
    "MaxPrice" => 0, 
    "StarLevel" => 0, 
    "AvailableOnly" => "false", 
    "PropertyType" => "NotSet", 
    "ExactDestination" => "false" 
); 

而且你可以生成XML這樣的:

// create simpleXML object 
$xml = new SimpleXMLElement("<?xml version=\"1.0\"?><SearchHotels></SearchHotels>"); 
$node = $xml->addChild('request'); 

// function call to convert array to xml 
array_to_xml($param, $node); 

// display XML to screen 
echo $xml->asXML(); 
die(); 

// function to convert an array to XML using SimpleXML 
function array_to_xml($array, &$xml) { 
    foreach($array as $key => $value) { 
     if(is_array($value)) { 
      if(!is_numeric($key)){ 
       $subnode = $xml->addChild("$key"); 
       array_to_xml($value, $subnode); 
      } else { 
       array_to_xml($value, $xml); 
      } 
     } else { 
      $xml->addChild("$key","$value"); 
     } 
    } 
} 

我屬性array_to_xml功能的美妙的作者在這裏:https://stackoverflow.com/a/5965940/2200766

+1

不試圖使用SimpleXML。我必須轉換爲通過SOAP客戶端發送的對象。進行您所建議的更改會使兩個RoomsInfo完全消失。 – swg1cor14

+0

請參閱我添加到問題末尾的修改 – swg1cor14

0

它看起來好像你應該有你這樣的數組,而不是;

$param = array(
     "Destination" => $destcode, 
     "HotelCityName" => $city, 
     "HotelLocationName" => "", 
     "HotelName" => "", 
     "CheckIn" => date("Y-m-d", strtotime($checkin)), 
     "CheckOut" => date("Y-m-d", strtotime($checkout)), 
     "RoomsInformation" => array (
      "RoomInfo" => array(
        array(
        "AdultNum" => 2, 
        "ChildNum" => 1, 
        "ChildAges" => array(
         "ChildAge" => array(
          "age"=>11 
         ) 
        ) 
       ), 
        array(
        "AdultNum" => 1, 
        "ChildNum" => 0, 
        "ChildAges" => array(
         "ChildAge" => array(
          "age"=>0 
         ) 
        ) 
       ) 
      ) 
     ), 
     "MaxPrice" => 0, 
     "StarLevel" => 0, 
     "AvailableOnly" => "false", 
     "PropertyType" => "NotSet", 
     "ExactDestination" => "false" 
    ); 

這將保留兩個RoomInfo數組元素。