Мне пришлось снова спросить об этом, извините, но у меня возникла проблема с обработкой этого массива. Я пробовал несколько разных способов, но нигде, где это правильно, вот массив:
Array ( [search] => Array ( [response] => Array ( [errors] => [number_of_hotels] => 1 of 1 ) [lr_rates] => Array ( [hotel] => Array ( [hotel_ref] => 3116 [hotel_currency] => [U] => USD [hotel_rooms] => Array ( [room] => Array ( [ref] => 6382 [type] => 1 [type_description] => Standard [sleeps] => 8 [rooms_available] => [adults] => 8 [children] => [breakfast] => false [dinner] => false [description] => [alternate_description] => [rack_rate] => 82.01 [date] => 19/08/201220/08/201221/08/2012 [numeric_hotelcurrencyprice] => FullFullFull [formatted_date] => 19 August 201220 August 201221 August 2012 [price] => FullFullFull [hotelcurrencyprice] => FullFullFull [numeric_price] => FullFullFull [requested_currency] => GBPGBPGBP [numeric_hotelcurrencyprice] => FullFullFull [available_online] => false [minimum_nights] => 1 [bed_type] => [cancellation_policy] => [cancellation_days] => [cancellation_hours] => [room_terms] => ) [room] => Array ( [ref] => 6382 [type] => 1 [type_description] => Standard [sleeps] => 8 [rooms_available] => [adults] => 8 [children] => [breakfast] => false [dinner] => false [description] => [alternate_description] => [rack_rate] => 82.01 [date] => 19/08/201220/08/201221/08/2012 [numeric_hotelcurrencyprice] => FullFullFull [formatted_date] => 19 August 201220 August 201221 August 2012 [price] => FullFullFull [hotelcurrencyprice] => FullFullFull [numeric_price] => FullFullFull [requested_currency] => GBPGBPGBP [numeric_hotelcurrencyprice] => FullFullFull [available_online] => false [minimum_nights] => 1 [bed_type] => [cancellation_policy] => [cancellation_days] => [cancellation_hours] => [room_terms] => ) ) [cancellation_type] => First Night Stay Chargeable [cancellation_policy] => 2 Days Prior to Arrival [CityTax] => Array ( [TypeName] => [Value] => [OptedIn] => [IsCityTaxArea] => ) ) ) ) )
Хорошо, мне нужно пересечь массив и создать цикл, поэтому для каждого экземпляра ROOM он повторит этот процесс. Затем мне нужно извлечь данные из массива комнат и использовать его для заполнения строк в MySQL для каждого экземпляра комнаты.
Это код, который я до сих пор печатал имена и значения в массиве комнат. Однако он получает только один из комнат. Что я могу сделать, чтобы прочитать все номера? Я также думаю, что это слишком много для каждого, но, похоже, не может пройтись вниз [''] [''] [''] … или просто используя ассоциативное имя.
foreach($arr['search'] as $lr_rates) { foreach($lr_rates['hotel'] as $hotel) { foreach($hotel['room'] as $field => $value){ print $field;print $value; } } }
Стоит также упомянуть, что значения в этих массивах всегда колеблются.
Я думаю, вы можете немного упростить эту цитату. Если вы знаете, что это будет всегда структура, тогда вы можете прыгать прямо в отели, а затем в комнаты.
foreach($arr['search']['lr_rates']['hotel'] as $hotel) { // You can access all of the keys in the hotel array here foreach($hotel['hotel_rooms'] as $room) { // Do stuff with the room array } }
Я бы рекомендовал либо построить сценарий вставки на ходу, либо вызвать базу данных только один раз для записи, или если вы обновляете, то используя транзакцию. По мере того, как количество комнат становится больше, вы замедляете свой скрипт с кучей записей на диск.
форматирование вывода ваших данных очень плохое и нечитаемое. Я не могу определить, что вы пытаетесь сделать.
возможность: внутренний массив [hotel_rooms] => Array ()
использует ключевую room
несколько раз. поскольку ключи массива уникальны, вы переписываете данные в индексной room
. вот почему вы получаете только одну комнату.
возможность: есть rooms
внутри room
-> используйте рекурсивную функцию для перебора во всех номерах:
function handleRoom(array $room) { // do something with $room if (array_key_exists('room', $room)) { handleRoom($room['room']); } } $room = array( 'some' => 'room', 'data' => 'and another', 'room' => array( 'is' => 'inside', 'of the' => 'main room', ), ); handleRoom($room);