Пожалуйста, прочитайте выделенную строку ниже, прежде чем комментировать, что это может быть дубликат. Это не имеет ничего общего с SimpleXML.
Позвольте мне начать, показывая, как 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("Ymd", strtotime($checkin)), "CheckOut" => date("Ymd", 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 и функция arrayToObject:
http://pastebin.com/SBUN0FAF
Проблема в том, что ваш массив недействителен, как вы подозревали, из-за дубликатов ключей. Один из способов решения проблемы – обернуть каждый «RoomInfo» в свой собственный массив следующим образом:
$param = array( "Destination" => $destcode, "HotelCityName" => $city, "HotelLocationName" => "", "HotelName" => "", "CheckIn" => date("Ymd", strtotime($checkin)), "CheckOut" => date("Ymd", 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
Похоже, что вместо этого вы должны иметь свой массив;
$param = array( "Destination" => $destcode, "HotelCityName" => $city, "HotelLocationName" => "", "HotelName" => "", "CheckIn" => date("Ymd", strtotime($checkin)), "CheckOut" => date("Ymd", 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.