J.K.A.
J.K.A.

Reputation: 7404

Ambiguity in PHP array

I want to display the Itinerary details from developer.ean.com API. By passing the customer's Itinerary ID and Email ID I got the details of reservation. The result is comming in json format so I decoded it and creating array by using :

$array=json_decode($result);

The problem is whatever the result comming from API contain problem like :

For some records it providing array like this:

[Itinerary] => stdClass Object
        (
            [HotelConfirmation] => Array
                (
                    [0] => stdClass Object
                        (
                            [supplierId] => 13
                            [chainCode] => EP
                            [arrivalDate] => 07/24/2012
                            [departureDate] => 07/26/2012
            )
            [Hotel] => Array
                        (
                            [0] => stdClass Object
                                (
                                   [hotelId] => 394808
                                   [statusCode] => A
                                   [name] => Barkston Youth Hostel
                )
            )
        )
    )

In this case the HotelConfirmation and Hotel is Array which contain [0] as object

and for some records it providing array like this:

[Itinerary] => stdClass Object
        (
            [HotelConfirmation] => stdClass Object
                (
                            [supplierId] => 13
                            [chainCode] => EP
                            [arrivalDate] => 07/24/2012
                            [departureDate] => 07/26/2012
            )
       [Hotel] => stdClass Object              
                (
                            [hotelId] => 394808
                            [statusCode] => A
                            [name] => Barkston Youth Hostel
            )
       )

and In this case the HotelConfirmation and Hotel is itself an object

I providing only few data here actually its big array and I want to provide list of it. But the array containing ambiguity like this. How can I handle this issue. Is there any solution.

Thanks in advance.

Upvotes: 2

Views: 187

Answers (8)

J.K.A.
J.K.A.

Reputation: 7404

First do this:

$array = json_decode($result, true);

Which will convert objects into associative arrays

And do adjustment like this:

if (isset($array['HotelItineraryResponse']['Itinerary']['HotelConfirmation'][0])) {
    $array['HotelItineraryResponse']['Itinerary']['HotelConfirmation'] = $array['HotelItineraryResponse']['Itinerary']['HotelConfirmation'][0];
}

It will definitly work.

Upvotes: 1

Luceos
Luceos

Reputation: 6730

Check for object or array:

if( is_object($Itinerary -> HotelConfirmation)) {
// do one thing or nothing
} elseif( is_array($Itinerary -> HotelConfirmation)) {
$Itinerary -> HotelConfirmation = array_shift( $Itinerary -> HotelConfirmation );
}

Upvotes: 0

Kaii
Kaii

Reputation: 20540

you can normalize the input like so:

// get objects as arrays
$array = json_decode($result, true);
// remove the sub-level [0], when necessary
foreach ($array as $key => $value) {
    if (is_array($value[0])) {
        $array[$key] = $value[0];
    }
}

Then the result always looks the same:

[Itinerary] => Array
        (
            [HotelConfirmation] => Array
                (
                            [supplierId] => 13
                            [chainCode] => EP
                            [arrivalDate] => 07/24/2012
                            [departureDate] => 07/26/2012
            )
            [Hotel] => Array              
                (
                            [hotelId] => 394808
                            [statusCode] => A
                            [name] => Barkston Youth Hostel
            )
       )

Upvotes: 2

Ibrahim Azhar Armar
Ibrahim Azhar Armar

Reputation: 25745

you can type case the object inside of an array.

$array = json_decode($result);
$array = (array)$array

or alternatively you can pass true as the second argument in your json_decode();

according to php documentation

When TRUE, returned objects will be converted into associative arrays.

$array = json_decode($result, true);

Upvotes: 0

Brian Adkins
Brian Adkins

Reputation: 666

Looks like you may have to account for both possibilities in your model... Checking to see if the hotel node contains and array or an obj and operating accordingly.

Upvotes: 0

user1299518
user1299518

Reputation:

just change to this:

$array=json_decode($result,TRUE);

and handle arrays always?

Upvotes: 0

Cameron Martin
Cameron Martin

Reputation: 6012

Pass true as the second argument to json_decode. This will create an array instead of stdClass

$array=json_decode($result, true);

Upvotes: 2

Rick Kuipers
Rick Kuipers

Reputation: 6617

You can use is_array() to check for it:

if (is_array($hotel)) {
    $hotel = $hotel[0];
}

Upvotes: 0

Related Questions