简体   繁体   English

使用PHP将API JSON响应与XML合并

[英]Merging API JSON response with XML using PHP

I have a tricky question here and I'm looking for some pointers to help me get the result I need. 我在这里有一个棘手的问题,我正在寻找一些建议来帮助我获得所需的结果。

So, I'm consuming an API for a hotel booking engine, the API is alright, but it is missing a few things which the client has provided in a separate static XML file (like descriptions of rooms, facilities etc). 因此,我正在使用一个用于酒店预订引擎的API,该API不错,但是它缺少客户端在单独的静态XML文件中提供的一些内容(例如,房间,设施等的描述)。

So, I have 4 things I need to do when a user searches for availability. 因此,当用户搜索可用性时,我需要做4件事。

  1. Get a list from the API of all the room types available. 从API获取所有可用房型的列表。 JSON below: 下方的JSON:

    { "results": [ { "id": 147, "name": "XXXXXXX Loft XL", "description": "XXXXXXX Loft XL", "code": "B1K", "max_occupancy": 2, "level": 2 }, { "id": 145, "name": "XXXXXXX Loft", "description": "XXXXXXX Loft", "code": "C1K", "max_occupancy": 2, "level": 1 } ], "total_count": 2 } {“结果”:[{“ id”:147,“名称”:“ XXXXXXX Loft XL”,“ description”:“ XXXXXXX Loft XL”,“ code”:“ B1K”,“ max_occupancy”:2,“ level” :2},{“ id”:145,“ name”:“ XXXXXXX Loft”,“ description”:“ XXXXXXX Loft”,“ code”:“ C1K”,“ max_occupancy”:2,“ level”:1}] ,“ total_count”:2}

  2. Get the availability for each room and show the 4 different prices per room inside the room types. 获取每个房间的可用性,并在房间类型内显示每个房间的4个不同价格。

  3. Merge the local static XML file which contains the room descriptions, icons, facilities etc with the room type API response. 合并包含房间说明,图标,设施等的本地静态XML文件以及房间类型API响应。

This is the XML to array: 这是要数组的XML:

        $roomdata = simplexml_load_file('room-data.xml');

        // put this into an array of sorts
        $roomjson = json_encode($roomdata);
        $roominformation = json_decode($roomjson,TRUE);
  1. Stitch all the content together and display it on screen for the user to select the room and rate they want. 将所有内容拼接在一起,并在屏幕上显示,以供用户选择所需的房间和等级。

I've tried putting things into arrays and matching keys (id in this case), but I'm not having much joy, it just keeps them separate. 我曾尝试将事物放入数组并匹配键(在这种情况下为id),但我并不高兴,只是将它们分开。

Any ideas on the best way to achieve this? 关于实现此目标的最佳方法有什么想法?

Here are some code snippets of what I am doing so far to consume the API and try and combine it with the XML. 以下是到目前为止我正在使用API​​并尝试将其与XML结合使用的一些代码片段。

$url = 'https://www.myapi.com'; // this gets the room types

    $options = array(
        CURLOPT_RETURNTRANSFER => true,   // return web page
        CURLOPT_HEADER         => false,  // don't return headers
        CURLOPT_FOLLOWLOCATION => true,   // follow redirects
        CURLOPT_MAXREDIRS      => 10,     // stop after 10 redirects
        CURLOPT_ENCODING       => "",     // handle compressed
        CURLOPT_USERAGENT      => "test", // name of client
        CURLOPT_AUTOREFERER    => true,   // set referrer on redirect
        CURLOPT_CONNECTTIMEOUT => 120,    // time-out on connect
        CURLOPT_TIMEOUT        => 120,    // time-out on response
    ); 
    $ch = curl_init($url);
    curl_setopt_array($ch, $options);
    $result = curl_exec($ch);

    curl_close($ch);

    // Decode the response
    $responseData = json_decode($result, TRUE);

    // Put everyting to the screen with var_dump;
    //var_dump($responseData);

    // With print_r ( useful for arrays );
    //print_r($responseData);

    // List just review ratings with foreach;
    $results = $responseData['results'];

    // create an class for rooms
    $room_types = new stdClass;

    $index = 1;

    foreach ($results as $rooms) {
    // This appends a new element to $room_types, in this case the value is another array
    $room_types_array[] = array('id' => $rooms['id'] ,'name' => $rooms['name'],'description' => $rooms['description']);
    $room_types = (object) $room_types_array;
    }

    // merge the arrays
    $room_data_merged = array_merge_recursive($room_types_array, $roominformation);

This is the array response when I try and combine the XML and API for room types: 当我尝试将XML和API组合为房间类型时,这是数组响应:

Array
(
    [0] => Array
        (
            [id] => 147
            [name] => XXXXXXX Loft XL
            [description] => XXXXXXX Loft XL
        )

    [1] => Array
        (
            [id] => 145
            [name] => XXXXXXX Loft
            [description] => XXXXXXX Loft
        )
    [room] => Array
        (
            [0] => Array
                (
                    [id] => 145
                    [roomname] => XXXXXXX Loft
                    [intro] => The 24m² XXXXXXX Loft sets new standards in the intelligent use of space. As a living/working hybrid, it can be easily adjusted to become cozy, business-like or something in between.
                    [introicons] => Array
                        (
                            [iconitem] => Array
                                (
                                    [0] => Array
                                        (
                                            [icon] => one-to-two-people
                                            [icondescription] => 1–2 Adults
                                        )

                                    [1] => Array
                                        (
                                            [icon] => wi-fi
                                            [icondescription] => Wi-Fi
                                        )

                                    [2] => Array
                                        (
                                            [icon] => whisk
                                            [icondescription] => Kitchen
                                        )

                                    [3] => Array
                                        (
                                            [icon] => bed
                                            [icondescription] => 1 King Size Bed
                                        )

                                )

                        )

                    [information] => Array
                        (
                            [informationitem] => Array
                                (
                                    [0] => Array
                                        (
                                            [icon] => bed
                                            [title] => King-Size Bed
                                            [description] => Our lovely beds guarantee the sweetest of dreams thanks to the layered mattress, fluffy duvet and 100% organic bed linen.
                                        )

                                    [1] => Array
                                        (
                                            [icon] => whisk
                                            [title] => Fully Equipped Kitchen
                                            [description] => The kitchen comes with built-in Siemens luxury equipment and is capable of pumping out the perfect cappuccinos in the morning and the tastiest of pastas at night.
                                        )

                                    [2] => Array
                                        (
                                            [icon] => table
                                            [title] => Large Kitchen Table
                                            [description] => At XXXXXXX, a big kitchen table serves as focal point. Use it to work across time zones, host dinner parties or gently rest your head after making deadline.
                                        )

                                    [3] => Array
                                        (
                                            [icon] => shower
                                            [title] => Spacious Shower Area
                                            [description] => The shower area features an awesome high-pressure shower and amenities.
                                        )

                                    [4] => Array
                                        (
                                            [icon] => wi-fi
                                            [title] => Wi-Fi
                                            [description] => Free, fast and reliable internet (wired & wireless) - EVERYWHERE.
                                        )

                                    [5] => Array
                                        (
                                            [icon] => coffee
                                            [title] => Living Room
                                            [description] => Lounge-styled living area with Muuto design couch and side table, along with a 32-Inch smart LED TV including BYOC (Bring Your Own Content) option. Complete with prickly-but-cosy green cacti and swappable art.
                                        )

                                )

                        )

                )

            [1] => Array
                (
                    [id] => 147
                    [roomname] => XXXXXXX Loft XL
                    [intro] => The extra spacious XXXXXXX Loft of 32m² sets new standards in the intelligent use of space. As a living/working hybrid, it can be easily adjusted to become cozy, business-like or something in between.
                    [introicons] => Array
                        (
                            [iconitem] => Array
                                (
                                    [0] => Array
                                        (
                                            [icon] => one-to-two-people
                                            [icondescription] => 1–2 Adults
                                        )

                                    [1] => Array
                                        (
                                            [icon] => wi-fi
                                            [icondescription] => Wi-Fi
                                        )

                                    [2] => Array
                                        (
                                            [icon] => whisk
                                            [icondescription] => Kitchen
                                        )

                                    [3] => Array
                                        (
                                            [icon] => bed
                                            [icondescription] => 1 King Size Bed
                                        )

                                )

                        )

                    [information] => Array
                        (
                            [informationitem] => Array
                                (
                                    [0] => Array
                                        (
                                            [icon] => bed
                                            [title] => King-Size Bed
                                            [description] => Our lovely beds guarantee the sweetest of dreams thanks to the layered mattress, fluffy duvet and 100% organic bed linen.
                                        )

                                    [1] => Array
                                        (
                                            [icon] => whisk
                                            [title] => Fully Equipped Kitchen
                                            [description] => The kitchen comes with built-in Siemens luxury equipment and is capable of pumping out the perfect cappuccinos in the morning and the tastiest of pastas at night.
                                        )

                                    [2] => Array
                                        (
                                            [icon] => table
                                            [title] => Large Kitchen Table
                                            [description] => At XXXXXXX, a big kitchen table serves as focal point. Use it to work across time zones, host dinner parties or gently rest your head after making deadline.
                                        )

                                    [3] => Array
                                        (
                                            [icon] => shower
                                            [title] => Spacious Shower Area
                                            [description] => The shower area features an awesome high-pressure shower and amenities.
                                        )

                                    [4] => Array
                                        (
                                            [icon] => wi-fi
                                            [title] => Wi-Fi
                                            [description] => Free, fast and reliable internet (wired & wireless) - EVERYWHERE.
                                        )

                                    [5] => Array
                                        (
                                            [icon] => coffee
                                            [title] => Living Room
                                            [description] => Lounge-styled living area with Muuto design couch and side table, along with a 32-Inch smart LED TV including BYOC (Bring Your Own Content) option. Complete with prickly-but-cosy green cacti and swappable art.
                                        )

                                )

                        )

                )

            [2] => Array
                (
                    [id] => 146
                    [roomname] => XXXXXXX Loft – Wall View
                    [intro] => A budget smart twist on our 24m² XXXXXXX Loft: All the same smart features, minus a view.
                    [introicons] => Array
                        (
                            [iconitem] => Array
                                (
                                    [0] => Array
                                        (
                                            [icon] => obstructed-view
                                            [icondescription] => Obstructed View
                                        )

                                    [1] => Array
                                        (
                                            [icon] => one-to-two-people
                                            [icondescription] => 1–2 Adults
                                        )

                                    [2] => Array
                                        (
                                            [icon] => wi-fi
                                            [icondescription] => Wi-Fi
                                        )

                                    [3] => Array
                                        (
                                            [icon] => whisk
                                            [icondescription] => Kitchen
                                        )

                                    [4] => Array
                                        (
                                            [icon] => bed
                                            [icondescription] => 1 King Size Bed
                                        )

                                )

                        )

                    [information] => Array
                        (
                            [informationitem] => Array
                                (
                                    [0] => Array
                                        (
                                            [icon] => bed
                                            [title] => King-Size Bed
                                            [description] => Our lovely beds guarantee the sweetest of dreams thanks to the layered mattress, fluffy duvet and 100% organic bed linen.
                                        )

                                    [1] => Array
                                        (
                                            [icon] => whisk
                                            [title] => Fully Equipped Kitchen
                                            [description] => The kitchen comes with built-in Siemens luxury equipment and is capable of pumping out the perfect cappuccinos in the morning and the tastiest of pastas at night.
                                        )

                                    [2] => Array
                                        (
                                            [icon] => table
                                            [title] => Large Kitchen Table
                                            [description] => At XXXXXXX, a big kitchen table serves as focal point. Use it to work across time zones, host dinner parties or gently rest your head after making deadline.
                                        )

                                    [3] => Array
                                        (
                                            [icon] => shower
                                            [title] => Spacious Shower Area
                                            [description] => The shower area features an awesome high-pressure shower and amenities.
                                        )

                                    [4] => Array
                                        (
                                            [icon] => wi-fi
                                            [title] => Wi-Fi
                                            [description] => Free, fast and reliable internet (wired & wireless) - EVERYWHERE.
                                        )

                                    [5] => Array
                                        (
                                            [icon] => coffee
                                            [title] => Living Room
                                            [description] => Lounge-styled living area with Muuto design couch and side table, along with a 32-Inch smart LED TV including BYOC (Bring Your Own Content) option. Complete with prickly-but-cosy green cacti and swappable art.
                                        )

                                )

                        )

                )

        )

)

Once I've then got all the room data together, I've got to somehow loop the available rates inside each DIV. 一旦将所有房间数据汇总在一起,就必须以某种方式在每个DIV中循环可用的费率。

Any help would be greatly appreciated! 任何帮助将不胜感激!

Simon 西蒙

You just need to search your various arrays based on some unique key (I guess id from your example code. 您只需要根据一些唯一键搜索各种数组(我猜示例代码中的id

foreach ($results as $rooms) {
    // First index using your unique key
    $result[$rooms['id']]['room'] = $rooms
    // Build a couple of search functions to grab an array based on unique key
    $result[$rooms['id']]['room_info']=search_your_json($json,$rooms['id']);
    $result[$rooms['id']]['room_data']=search_other_data_function($rooms['id']);
}

Then you will get an array like: 然后,您将得到一个类似的数组:

 [
    145=>[
          'room'=>[//array of room],
          'room_info'=>[//array of room info],
          'room_data'=>[//array of room data]
          ],
    147=>[
          //same array structure here
          ]
 ]

I think I have your various data sources mis-labled but you should get the idea. 我想我对各种数据源都有误解,但您应该明白这一点。

Example search function 示例搜索功能

 search_your_json($json,$room_id){
     $data = json_decode($json,true);//true for an array     
     foreach($data as $d){
      if($d['id']===$room_id){//if it has the right id return the array $d
       return $d
       }
      }
    return false;
 }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM