从关联数组创建复杂对象PHP
从数组中创建复杂对象PHP,用于酒店预订信息。从关联数组创建复杂对象PHP,php,object,Php,Object,从数组中创建复杂对象PHP,用于酒店预订信息。 实际上,我必须从XML响应中恢复一些数据,这些数据需要显示给最终用户。 我会创建一个对象或其他东西来帮助我快速恢复数据。 当您调用一个函数时,比如上面的函数,您必须返回一个易于访问所有数据的对象,并且可以由 $resXML = $test->sendXML($xml_req); //$dom = new DOMDocument; $dom = new DOMDocument('1.0'); $dom->loadXML($resXML)
实际上,我必须从XML响应中恢复一些数据,这些数据需要显示给最终用户。 我会创建一个对象或其他东西来帮助我快速恢复数据。 当您调用一个函数时,比如上面的函数,您必须返回一个易于访问所有数据的对象,并且可以由
$resXML = $test->sendXML($xml_req);
//$dom = new DOMDocument;
$dom = new DOMDocument('1.0');
$dom->loadXML($resXML);
$success = $dom->getElementsByTagName('success');
$error = $dom->getElementsByTagName('error');
$hotels = $dom->getElementsByTagName('hotel');
$room = $dom->getElementsByTagName('room');
$arr_hotels = [];
$arr_rooms = [];
$n_hotel=0;
foreach($hotels as $hotel){
$idHotel = $hotel->getAttribute('xsd:id');
$nomeHotel = $hotel->getAttribute('xsd:name');
//echo "<strong>Nome Hotel: </strong>" . $hotel->getAttribute('xsd:name')."<br>";
$arr_hotels[] = ['idHotel'=>$idHotel, 'nomeHotel'=>$nomeHotel];
$rooms = $hotel->getElementsByTagName('room');
foreach($rooms as $room){
/*
echo "Prezzo: " . $room->getAttribute('xsd:price')."<br>";
$boardType = $room->getElementsByTagName('boardType');
$roomType = $room->getElementsByTagName('roomType');
echo "Nome Gruppo: " . $boardType[0]->getAttribute('xsd:groupName')."<br>";
echo "Tipo Stanza: " . $roomType[0]->getAttribute('xsd1:nameEn')."<br>";
*/
$boardType = $room->getElementsByTagName('boardType');
$roomType = $room->getElementsByTagName('roomType');
$idRoom = $room->getAttribute('xsd:id'); // Id della stanza
$prezzo = $room->getAttribute('xsd:price'); // prezzo della stanza
$idGruppo = $boardType[0]->getAttribute('xsd:groupId'); // Id Gruppo tipo di stanza
$nomeGruppo = $boardType[0]->getAttribute('xsd:groupName'); // nome gruppo tipo stanza
$idTipo = $boardType[0]->getAttribute('xsd1:id'); // Tipo specifico di stanza Colazione, Lunch
$nomeTipo = $roomType[0]->getAttribute('xsd1:nameEn'); // nome del tipo
$arr_hotels[]= array('idRoom'=>$idRoom,'prezzo'=>$prezzo);
}
$n_hotel++;
return $arr_hotels;
}
编辑
我根据下面的答案做了这些改动
function getHotelList(){
foreach($hotels as $hotel){
$h = new stdClass();
$h->idHotel = $hotel->getAttribute('xsd:id');
$h->nomeHotel = $hotel->getAttribute('xsd:name');
$h->last_update = $hotel->getAttribute('xsd:lastUpdated');
$rooms = $hotel->getElementsByTagName('room');
//$idHotel = $hotel->getAttribute('xsd:id');
//$nomeHotel = $hotel->getAttribute('xsd:name');
//echo "<strong>Nome Hotel: </strong>" . $hotel->getAttribute('xsd:name')."<br>";
//$arr_hotels[] = ['idHotel'=>$idHotel, 'nomeHotel'=>$nomeHotel];
//$rooms = $hotel->getElementsByTagName('room');
foreach($rooms as $room){
/*
echo "Prezzo: " . $room->getAttribute('xsd:price')."<br>";
$boardType = $room->getElementsByTagName('boardType');
$roomType = $room->getElementsByTagName('roomType');
echo "Nome Gruppo: " . $boardType[0]->getAttribute('xsd:groupName')."<br>";
echo "Tipo Stanza: " . $roomType[0]->getAttribute('xsd1:nameEn')."<br>";
*/
$boardType = $room->getElementsByTagName('boardType');
$roomType = $room->getElementsByTagName('roomType');
$r = new stdClass();
// Stanza
$r->roomId = $room->getAttribute('xsd:id'); // Id della stanza
$r->prezzo = $room->getAttribute('xsd:price'); // prezzo della stanza
// Board Type
$r->idGruppo = $boardType[0]->getAttribute('xsd:groupId');
$r->nomeGruppo = $boardType[0]->getAttribute('xsd:groupName');
$r->idTipoServizi = $boardType[0]->getAttribute('xsd1:id');
// Room Type
$r->idRoomType = $roomType[0]->getAttribute('xsd1:id');
$r->nomeRoomType = $roomType[0]->getAttribute('xsd:hotelstonName');
$h->rooms[] = $r;
/*
$idRoom = $room->getAttribute('xsd:id'); // Id della stanza
$prezzo = $room->getAttribute('xsd:price'); // prezzo della stanza
$idGruppo = $boardType[0]->getAttribute('xsd:groupId'); // Id Gruppo tipo di stanza
$nomeGruppo = $boardType[0]->getAttribute('xsd:groupName'); // nome gruppo tipo stanza
$idTipo = $boardType[0]->getAttribute('xsd1:id'); // Tipo specifico di stanza Colazione, Lunch
$nomeTipo = $roomType[0]->getAttribute('xsd1:nameEn'); // nome del tipo
$arr_rooms[$nomeHotel][]= array('idRoom'=>$idRoom,'prezzo'=>$prezzo);
*/
}
$n_hotel++;
$arr_hotels[] = $h;
}
$res = json_encode( $arr_hotels );
return $res;
}
到目前为止,一切顺利。
但是我如何访问数据呢
echo $res->nomeHotel;
echo $res[0]->nomeHotel;
echo $res[0]['nomeHotel'];
不要工作我会这样做
$resXML = $test->sendXML($xml_req);
//$dom = new DOMDocument;
$dom = new DOMDocument('1.0');
$dom->loadXML($resXML);
$success = $dom->getElementsByTagName('success');
$error = $dom->getElementsByTagName('error');
$hotels = $dom->getElementsByTagName('hotel');
$room = $dom->getElementsByTagName('room');
$arr_hotels = [];
//$n_hotel=0; does not appear to be used
foreach($hotels as $hotel){
$h = new stdClass();
$h->idHotel = $hotel->getAttribute('xsd:id');
$h->nomeHotel = $hotel->getAttribute('xsd:name');
$h->last_update = $hotel->getAttribute('xsd:lastupdate');
$rooms = $hotel->getElementsByTagName('room');
foreach($rooms as $room){
$r = new stdClass();
$r->price = $room->getAttribute('xsd:price');
$r->boardType = $room->getElementsByTagName('boardType');
$r->roomType = $room->getElementsByTagName('roomType');
$r->groupname = $boardType[0]->getAttribute('xsd:groupName');
$r->nameEn = $roomType[0]->getAttribute('xsd1:nameEn');
$r->idRoom = $room->getAttribute('xsd:id'); // Id della stanza
$r->prezzo = $room->getAttribute('xsd:price'); // prezzo della stanza
$r->idGruppo = $boardType[0]->getAttribute('xsd:groupId');
$r->nomeGruppo = $boardType[0]->getAttribute('xsd:groupName');
$r->idTipo = $boardType[0]->getAttribute('xsd1:id');
$r->nomeTipo = $roomType[0]->getAttribute('xsd1:nameEn');
$h->rooms[] = $r;
}
$arr_hotels[] = $h;
//$n_hotel++; Does not appear to be used
}
echo json_encode( $arr_hotels );
当然,您可能需要检查属性名称是否符合您的要求,我假设lastupdate
属性名称
更新
根据您第一次尝试实现我的建议,现在您必须向函数传递一个参数才能启动它
function getHotelList($hotels){
$arr_hotels[];
foreach($hotels as $hotel){
$h = new stdClass();
$h->idHotel = $hotel->getAttribute('xsd:id');
$h->nomeHotel = $hotel->getAttribute('xsd:name');
$h->last_update = $hotel->getAttribute('xsd:lastUpdated');
$rooms = $hotel->getElementsByTagName('room');
foreach($rooms as $room){
$boardType = $room->getElementsByTagName('boardType');
$roomType = $room->getElementsByTagName('roomType');
$r = new stdClass();
$r->roomId = $room->getAttribute('xsd:id');
$r->prezzo = $room->getAttribute('xsd:price');
$r->idGruppo = $boardType[0]->getAttribute('xsd:groupId');
$r->nomeGruppo = $boardType[0]->getAttribute('xsd:groupName');
$r->idTipoServizi = $boardType[0]->getAttribute('xsd1:id');
$r->idRoomType = $roomType[0]->getAttribute('xsd1:id');
$r->nomeRoomType = $roomType[0]->getAttribute('xsd:hotelstonName');
$h->rooms[] = $r;
}
$n_hotel++;
$arr_hotels[] = $h;
}
return json_encode( $arr_hotels );
}
$resXML = $test->sendXML($xml_req);
$dom = new DOMDocument('1.0');
$dom->loadXML($resXML);
$success = $dom->getElementsByTagName('success');
$error = $dom->getElementsByTagName('error');
$hotels = $dom->getElementsByTagName('hotel');
$json_string = getHotelList($hotels);
更新2
如果您想访问PHP中的数据结构,那么不要将其转换为JSON字符串,而是将其用作PHP数据结构
function getHotelList($hotels){
$arr_hotels[];
foreach($hotels as $hotel){
$h = new stdClass();
$h->idHotel = $hotel->getAttribute('xsd:id');
$h->nomeHotel = $hotel->getAttribute('xsd:name');
$h->last_update = $hotel->getAttribute('xsd:lastUpdated');
$rooms = $hotel->getElementsByTagName('room');
foreach($rooms as $room){
$boardType = $room->getElementsByTagName('boardType');
$roomType = $room->getElementsByTagName('roomType');
$r = new stdClass();
$r->roomId = $room->getAttribute('xsd:id');
$r->prezzo = $room->getAttribute('xsd:price');
$r->idGruppo = $boardType[0]->getAttribute('xsd:groupId');
$r->nomeGruppo = $boardType[0]->getAttribute('xsd:groupName');
$r->idTipoServizi = $boardType[0]->getAttribute('xsd1:id');
$r->idRoomType = $roomType[0]->getAttribute('xsd1:id');
$r->nomeRoomType = $roomType[0]->getAttribute('xsd:hotelstonName');
$h->rooms[] = $r;
}
$n_hotel++;
$arr_hotels[] = $h;
}
return $arr_hotels;
}
$resXML = $test->sendXML($xml_req);
$dom = new DOMDocument('1.0');
$dom->loadXML($resXML);
$success = $dom->getElementsByTagName('success');
$error = $dom->getElementsByTagName('error');
$hotels = $dom->getElementsByTagName('hotel');
$php_hotels = getHotelList($hotels);
// print_r($php_hotels); // do this to see the data structure
foreach ( $php_hotels as $ph ) {
echo $ph->nomeHotel;
}
要查看结构的外观,只需执行
print\r($php\u hotels)代码>无效JSONIt甚至不是有效的PHP。这就像是无效JSON和PHP的混合@这太愚蠢了,我已经弄明白了!首先,向我们展示如何获取要构建到JSON数据结构中的数据。实际上,我必须从XML响应中恢复一些数据,我需要向最终用户显示这些数据。我会创建一个对象或其他东西来帮助我快速恢复数据。调用函数时,如上面的函数,必须返回一个易于访问所有数据的对象,并且可以通过创建JSON字符串的进行编辑,通常用于发送到页面上的某个javascript代码。如果你只使用PHP查看这些数据,你不需要这样做。谢谢@RiggsFolly,我现在就去试试
function getHotelList($hotels){
$arr_hotels[];
foreach($hotels as $hotel){
$h = new stdClass();
$h->idHotel = $hotel->getAttribute('xsd:id');
$h->nomeHotel = $hotel->getAttribute('xsd:name');
$h->last_update = $hotel->getAttribute('xsd:lastUpdated');
$rooms = $hotel->getElementsByTagName('room');
foreach($rooms as $room){
$boardType = $room->getElementsByTagName('boardType');
$roomType = $room->getElementsByTagName('roomType');
$r = new stdClass();
$r->roomId = $room->getAttribute('xsd:id');
$r->prezzo = $room->getAttribute('xsd:price');
$r->idGruppo = $boardType[0]->getAttribute('xsd:groupId');
$r->nomeGruppo = $boardType[0]->getAttribute('xsd:groupName');
$r->idTipoServizi = $boardType[0]->getAttribute('xsd1:id');
$r->idRoomType = $roomType[0]->getAttribute('xsd1:id');
$r->nomeRoomType = $roomType[0]->getAttribute('xsd:hotelstonName');
$h->rooms[] = $r;
}
$n_hotel++;
$arr_hotels[] = $h;
}
return json_encode( $arr_hotels );
}
$resXML = $test->sendXML($xml_req);
$dom = new DOMDocument('1.0');
$dom->loadXML($resXML);
$success = $dom->getElementsByTagName('success');
$error = $dom->getElementsByTagName('error');
$hotels = $dom->getElementsByTagName('hotel');
$json_string = getHotelList($hotels);
function getHotelList($hotels){
$arr_hotels[];
foreach($hotels as $hotel){
$h = new stdClass();
$h->idHotel = $hotel->getAttribute('xsd:id');
$h->nomeHotel = $hotel->getAttribute('xsd:name');
$h->last_update = $hotel->getAttribute('xsd:lastUpdated');
$rooms = $hotel->getElementsByTagName('room');
foreach($rooms as $room){
$boardType = $room->getElementsByTagName('boardType');
$roomType = $room->getElementsByTagName('roomType');
$r = new stdClass();
$r->roomId = $room->getAttribute('xsd:id');
$r->prezzo = $room->getAttribute('xsd:price');
$r->idGruppo = $boardType[0]->getAttribute('xsd:groupId');
$r->nomeGruppo = $boardType[0]->getAttribute('xsd:groupName');
$r->idTipoServizi = $boardType[0]->getAttribute('xsd1:id');
$r->idRoomType = $roomType[0]->getAttribute('xsd1:id');
$r->nomeRoomType = $roomType[0]->getAttribute('xsd:hotelstonName');
$h->rooms[] = $r;
}
$n_hotel++;
$arr_hotels[] = $h;
}
return $arr_hotels;
}
$resXML = $test->sendXML($xml_req);
$dom = new DOMDocument('1.0');
$dom->loadXML($resXML);
$success = $dom->getElementsByTagName('success');
$error = $dom->getElementsByTagName('error');
$hotels = $dom->getElementsByTagName('hotel');
$php_hotels = getHotelList($hotels);
// print_r($php_hotels); // do this to see the data structure
foreach ( $php_hotels as $ph ) {
echo $ph->nomeHotel;
}