Получить значения из более глубокого вложенного многомерного массива - PullRequest
0 голосов
/ 29 октября 2018

У меня есть следующий json_decode ($ array, true); Данные нескольких отелей.

array: 10[▼
    "HotelName" => "AL MANZIL DOWNTOWN DUBAI"
    "PreferredStatus" => "A"
    "PropertyType" => "City Hotel"
    "StarRating" => "4"
    "GeoLocation" => array: 2[▶]
    "Chain" => "ADDRESS HOTELS"
    "HotelCode" => "32-4560"
    "HotelDescr" => []
    "Zone" => "Downtown"
    "RoomTypeDetails" => array: 1[▼
      "Rooms" => array: 1[▼
        "Room" => array: 18[▼
          0 => array: 23[▼
            "RoomNo" => "1"
            "RoomType" => "DELUXE ROOM"
            "RoomTypeCode" => "14264"
            "RoomStatus" => "OK"
            "BlackOut" => array: 2[▶]
            "CurrCode" => "AED"
            "ContractTokenId" => "191032"
            "RoomConfigurationId" => "1"
            "DynamicInventory" => "N"
            "ContractLabel" => []
            "Refundable" => "Y"
            "PackageYN" => "N"
            "MealPlan" => "ROOM ONLY"
            "MealPlanCode" => "1380"
            "RoomNumber" => "1"
            "BuyRate" => []
            "CommissionSellCharges" => []
            "TaxSellCharges" => []
            "Rate" => "3430.4"
            "RoomStatusDetails" => array: 1[▶]
            "SupplementDetails" => array:1 [▼
              "Supplement" => array:12 [▼
                 "Id" => "403880"
                 "FromDate" => "20191015"
                 "ToDate" => "20191018"
                 "Qty" => "1"
                 "Rate" => "127"
                 "CommissionSellCharges" => []
                 "TaxSellCharges" => []
                 "BuyRate" => []
                 "Name" => "CHILD SUPPLEMENT"
                 "OptionalYN" => "N"
                 "ValidOn" => "YYYYYYY"
                 "Nights" => "4"
               ]
             ]
            "DiscountDetails" => array: 1[▼
              "Discount" => array: 8[▼
                "DiscountName" => "EARLY BIRD OFFER 2019-2020  20 % DISCOUNT"
                "DiscountType" => "Price Reduction Discount"
                "DiscountNotes" => "<html><body><p><strong>EARLY BIRD OFFER 2019 - 2020 | 20% DISCOUNT <br /><br />Terms and Conditions:</strong> <br />- Applicable for all booking received&nbsp;6 ▶"
                "DiscountTypeCode" => "0"
                "TotalDiscountRate" => "857.6"
                "CommissionSellCharges" => []
                "TaxSellCharges" => []
                "TotalDiscountBuyRate" => []
              ]
            ]
            "PromotionalContract" => "N"
          ] 1 => array: 23[▼
            "RoomNo" => "1"
            "RoomType" => "DELUXE ROOM"
            "RoomTypeCode" => "14264"
            "RoomStatus" => "OK"
            "BlackOut" => array: 2[▶]
            "CurrCode" => "AED"
            "ContractTokenId" => "191032"
            "RoomConfigurationId" => "1"
            "DynamicInventory" => "N"
            "ContractLabel" => []
            "Refundable" => "Y"
            "PackageYN" => "N"
            "MealPlan" => "BED AND BREAKFAST"
            "MealPlanCode" => "1376"
            "RoomNumber" => "1"
            "BuyRate" => []
            "CommissionSellCharges" => []
            "TaxSellCharges" => []
            "Rate" => "4019.2"
            "RoomStatusDetails" => array: 1[▶]
            "SupplementDetails" => array: 1[▶]
            "DiscountDetails" => array: 1[▶]
            "PromotionalContract" => "N"
          ]

Я могу использовать цикл foreach для получения значений определенного отеля, как показано ниже, код,

//All the hotel names
@foreach ($array['Hotels']['Hotel'] as $key => $hotel){

echo $hotel['HotelName']; //Displays all the hotel names
}

// All the RoomTypes of a single hotel array
@foreach ($hotel['RoomTypeDetails']['Rooms']['Room'] as $k => $rt {

  echo $rt['RoomType'];  //Displays all the RoomTypes of a hotel
}

//I would like to get the discounts of a single room type of a hotel
@foreach ($rt['DiscountDetails'] as $d { 

  echo $d['DiscountName'] // NOT WORKING - Throws error, Undefined index - 
  NEED HELP HERE
}

//I would like to get the supplements of a single room type of a hotel
@foreach ($rt['SupplementDetails']['Supplement'] as $s { 

  echo $s['Name'] // NOT WORKING - Throws error, Undefined Index - NEED HELP  
  HERE
}

Я занимаюсь разработкой с использованием инфраструктуры laravel, v5.7, эти данные представляют собой XML-ответы через удаленный API, декодированные json для использования в моем приложении. Я пытался выяснить, как отобразить более глубокие вложенные элементы массивов внутри многомерного массива.

Я хотел бы получить следующую иерархию значений из вышеприведенных выходных данных json.

  1. Отель> Номер> Цены (скидки)
  2. Отель> Номер> Доплата

Я искал переполнение стека и другие форумы, и я нашел некоторые сценарии и возможные решения, также применил некоторые, но, похоже, он не отображает значения, которые мне нужны.

Пробовал вложенные для каждой функции, но я не мог заставить ее работать. Если у вас, ребята, есть какой-либо опыт работы с такими данными, пожалуйста, помогите мне или направьте меня за рекомендациями по работе с более глубокими вложенными многомерными массивами.

Если вам интересно, здесь дамп для переменной $ rt [она уже находится в одном элементе отеля]

array: 23[▼
  "RoomNo" => "1"
  "RoomType" => "DELUXE ROOM"
  "RoomTypeCode" => "14264"
  "RoomStatus" => "OK"
  "BlackOut" => array: 2[▶]
  "CurrCode" => "AED"
  "ContractTokenId" => "191032"
  "RoomConfigurationId" => "1"
  "DynamicInventory" => "N"
  "ContractLabel" => []
  "Refundable" => "Y"
  "PackageYN" => "N"
  "MealPlan" => "ROOM ONLY"
  "MealPlanCode" => "1380"
  "RoomNumber" => "1"
  "BuyRate" => []
  "CommissionSellCharges" => []
  "TaxSellCharges" => []
  "Rate" => "3430.4"
  "RoomStatusDetails" => array: 1[▶]
  "SupplementDetails" => array: 1[▼
    "Supplement" => array: 12[▼
      "Id" => "403880"
      "FromDate" => "20191015"
      "ToDate" => "20191018"
      "Qty" => "1"
      "Rate" => "127"
      "CommissionSellCharges" => []
      "TaxSellCharges" => []
      "BuyRate" => []
      "Name" => "CHILD SUPPLEMENT"
      "OptionalYN" => "N"
      "ValidOn" => "YYYYYYY"
      "Nights" => "4"
    ]
  ]
  "DiscountDetails" => array: 1[▼
    "Discount" => array: 8[▼
      "DiscountName" => "EARLY BIRD OFFER 2019-2020  20 % DISCOUNT"
      "DiscountType" => "Price Reduction Discount"
      "DiscountNotes" => "<html><body><p><strong>EARLY BIRD OFFER 2019 - 2020 | 20% DISCOUNT <br /><br />Terms and Conditions:</strong> <br />- Applicable for all booking received&nbsp;6 ▶"
      "DiscountTypeCode" => "0"
      "TotalDiscountRate" => "857.6"
      "CommissionSellCharges" => []
      "TaxSellCharges" => []
      "TotalDiscountBuyRate" => []
    ]
  ]
  "PromotionalContract" => "N"
]

Большое спасибо! Aisar

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

насколько я вижу, вы забыли некоторые части своего кода, индексы

@foreach ($rt['RoomTypeDetails']['Rooms']['Room']['DiscountDetails'] as $d { 

  echo $d['DiscountName'];
}


@foreach ($rt['RoomTypeDetails']['Rooms']['Room']['SupplementDetails']['Supplement'] as $s { 

  echo $s['Name'];
}
0 голосов
/ 29 октября 2018

Вы можете использовать вспомогательную функцию Laravel, например, data_get (), даже функции коллекций, такие как get(), pluck() и т. Д., Для работы с Arrayable Items.

Давайте используем data_get() в качестве примера, чтобы получить все MealPlan, используя этот путь RoomTypeDetails->Rooms->Room->*-> MealPlan:

$data = [
            "HotelName" => "AL MANZIL DOWNTOWN DUBAI",
            "PreferredStatus" => "A",
            "PropertyType" => "City Hotel",
            "StarRating" => "4",
            "GeoLocation" => [],
            "Chain" => "ADDRESS HOTELS",
            "HotelCode" => "32-4560",
            "HotelDescr" => [],
            "Zone" => "Downtown",
            "RoomTypeDetails" => [
                "Rooms" => [
                    "Room" => [
                        0 => [
                            "RoomNo" => "1",
                            "RoomType" => "DELUXE ROOM",
                            "RoomTypeCode" => "14264",
                            "RoomStatus" => "OK",
                            "BlackOut" => [],
                            "CurrCode" => "AED",
                            "ContractTokenId" => "191032",
                            "RoomConfigurationId" => "1",
                            "DynamicInventory" => "N",
                            "ContractLabel" => [],
                            "Refundable" => "Y",
                            "PackageYN" => "N",
                            "MealPlan" => "ROOM ONLY",
                            "MealPlanCode" => "1380",
                            "RoomNumber" => "1",
                            "BuyRate" => [],
                            "CommissionSellCharges" => [],
                            "TaxSellCharges" => [],
                            "Rate" => "3430.4",
                            "RoomStatusDetails" => [],
                            "SupplementDetails" => [
                                "Supplement" => [
                                    "Id" => "403880",
                                    "FromDate" => "20191015",
                                    "ToDate" => "20191018",
                                    "Qty" => "1",
                                    "Rate" => "127",
                                    "CommissionSellCharges" => [],
                                    "TaxSellCharges" => [],
                                    "BuyRate" => [],
                                    "Name" => "CHILD SUPPLEMENT",
                                    "OptionalYN" => "N",
                                    "ValidOn" => "YYYYYYY",
                                    "Nights" => "4",
                                ]
                            ],
                            "DiscountDetails" => [
                                "Discount" => [
                                    "DiscountName" => "EARLY BIRD OFFER 2019-2020  20 % DISCOUNT",
                                    "DiscountType" => "Price Reduction Discount",
                                    "DiscountNotes" => "<html><body><p><strong>EARLY BIRD OFFER 2019 - 2020 | 20% DISCOUNT <br /><br />Terms and Conditions:</strong> <br />- Applicable for all booking received&nbsp;6 ",
                                    "DiscountTypeCode" => "0",
                                    "TotalDiscountRate" => "857.6",
                                    "CommissionSellCharges" => [],
                                    "TaxSellCharges" => [],
                                    "TotalDiscountBuyRate" => [],
                                ],
                            ],
                            "PromotionalContract" => "N",
                        ], 1 => [
                            "RoomNo" => "1",
                            "RoomType" => "DELUXE ROOM",
                            "RoomTypeCode" => "14264",
                            "RoomStatus" => "OK",
                            "BlackOut" => [],
                            "CurrCode" => "AED",
                            "ContractTokenId" => "191032",
                            "RoomConfigurationId" => "1",
                            "DynamicInventory" => "N",
                            "ContractLabel" => [],
                            "Refundable" => "Y",
                            "PackageYN" => "N",
                            "MealPlan" => "BED AND BREAKFAST",
                            "MealPlanCode" => "1376",
                            "RoomNumber" => "1",
                            "BuyRate" => [],
                            "CommissionSellCharges" => [],
                            "TaxSellCharges" => [],
                            "Rate" => "4019.2",
                            "RoomStatusDetails" => [],
                            "SupplementDetails" => [],
                            "DiscountDetails" => [],
                            "PromotionalContract" => "N",
                        ],
                    ]
                ]
            ]
        ];

        return data_get($data,'RoomTypeDetails.Rooms.Room.*.MealPlan');

Это даст вам:

[
"ROOM ONLY",
"BED AND BREAKFAST"
]

Обновление:

Подобно тому, как @simonecosci упоминал, чтобы получить индивидуальное значение, используя нотацию «точка», вы можете использовать array_get , чтобы у вас было:

array_get($data,'RoomTypeDetails.Rooms.Room.1.MealPlan')

Преимущество использования этого метода помимо исключения foreach состоит в том, что он возвращает null, когда свойство / индекс не существует в массиве.

0 голосов
/ 29 октября 2018

Попробуй это. Получение некоторого значения не требует цикла.

//All the hotel names
@foreach ($array['Hotels']['Hotel'] as $key => $hotel){

    echo $hotel['HotelName']; //Displays all the hotel names

    // All the RoomTypes of a single hotel array
    @foreach ($hotel['RoomTypeDetails']['Rooms']['Room'] as $k => $rt {

      echo $rt['RoomType'];  //Displays all the RoomTypes of a hotel


      //I would like to get the discounts of a single room type of a hotel
      if(isset($rt['DiscountDetails']['Discount']['DiscountName']))
          echo $rt['DiscountDetails']['Discount']['DiscountName'];
      else
          echo 'No discount';

      //I would like to get the supplements of a single room type of a hotel
      if(isset($rt['SupplementDetails']['Supplement']['Name']))
          echo $rt['SupplementDetails']['Supplement']['Name'];
      else
          echo 'No Supplement';

    }
}
...