2

我想显示来自 developer.ean.com API 的行程详细信息。通过传递客户的行程 ID 和电子邮件 ID,我得到了预订的详细信息。结果以 json 格式出现,因此我对其进行解码并使用以下方法创建数组:

$array=json_decode($result);

问题是来自 API 的任何结果都包含以下问题:

对于某些记录,它提供如下数组:

[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
                )
            )
        )
    )

在这种情况下,HotelConfirmation 和 Hotel 是包含 [0] 作为对象的数组

对于某些记录,它提供如下数组:

[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
            )
       )

在这种情况下,HotelConfirmation 和 Hotel 本身就是一个对象

我在这里只提供很少的数据实际上是它的大数组,我想提供它的列表。但是数组包含这样的歧义。我该如何处理这个问题。有什么解决办法。

提前致谢。

4

8 回答 8

2

您可以像这样规范化输入:

// 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];
    }
}

然后结果看起来总是一样的:

[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
            )
       )
于 2012-06-28T12:24:30.480 回答
2

true作为第二个参数传递给json_decode. 这将创建一个数组而不是stdClass

$array=json_decode($result, true);
于 2012-06-28T12:16:58.647 回答
1

首先这样做:

$array = json_decode($result, true);

它将对象转换为关联数组

并像这样进行调整:

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

它肯定会起作用。

于 2012-06-29T06:58:38.683 回答
0

您可以键入 case 数组内的对象。

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

或者,您可以将 true 作为 json_decode() 中的第二个参数传递;

根据php文档

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

$array = json_decode($result, true);
于 2012-06-28T12:21:14.853 回答
0

改成这样:

$array=json_decode($result,TRUE);

并始终处理数组?

于 2012-06-28T12:17:39.893 回答
0

看起来您可能必须在模型中考虑这两种可能性...检查酒店节点是否包含数组或 obj 并进行相应操作。

于 2012-06-28T12:17:41.220 回答
0

您可以使用is_array()它来检查它:

if (is_array($hotel)) {
    $hotel = $hotel[0];
}
于 2012-06-28T12:15:19.600 回答
0

检查对象或数组:

if( is_object($Itinerary -> HotelConfirmation)) {
// do one thing or nothing
} elseif( is_array($Itinerary -> HotelConfirmation)) {
$Itinerary -> HotelConfirmation = array_shift( $Itinerary -> HotelConfirmation );
}
于 2012-06-28T12:15:47.430 回答