Когда вы делаете это ...
$hotelinfo[count($hotelinfo)] = array();
$hotelinfo[count($hotelinfo)][$HotelName] = array();
Вы фактически добавляете два элемента к $hotelinfo
. Например, если в нем уже было 4 элемента, в первой строке будет установлен индекс 4, который является новым индексом (существующие 0, 1, 2 и 3), добавляя, таким образом, элемент.
Теперь, когда первая строка выполнена, количество элементов в $hotelinfo
равно 5, и, таким образом, вторая строка устанавливает индекс 5 - но индекс 5 соответствует следующему пустому интервалу, и, таким образом, добавляется второй элемент (для конечный результат установки индексов 0-5, причем 4 и 5 оба новые).
Судя по вашему коду, я не думаю, что это то, что вы хотели.
Пройдя лишнюю милю (или две) ...
Я думаю, что вы, возможно, захотите сначала сделать данные в более удобном для использования формате, сгруппированные сначала по отелю, а затем по номеру комнаты. Итак, давайте сделаем это:
$hotelInfo = array();
foreach($result->RoomInformation as $roomInfo) {
$hotelName = $roomInfo->RoomInformationExtend->RoomDetails->Description;
if(!isset($hotelInfo[$hotelName])) {
$hotelInfo[$hotelName] = array();
}
$thisHotel = $hotelInfo[$hotelName];
$roomId = $roomInfo->RoomInformationExtend->RoomDetails->RoomId;
if(!isset($thisHotel[$roomId])) {
$thisHotel[$roomId] = array();
}
$thisRoom = $thisHotel[$roomId];
Хорошо, теперь у нас есть объект $thisRoom
, для которого мы можем заполнить информацию. Если другой элемент в списке, который мы просматриваем, уже создал объект для определенной комбинации отель + номер, мы просто получим уже созданный объект вместо создания нового.
Теперь мы добавим любую релевантную информацию о текущем элементе данных в наш объект комнаты:
if(isset($roomInfo->Details)) {
if(isset($roomInfo->Details->EffectiveDate)) {
// "$foo[] = bar" appends 'bar' to the array '$foo'
$thisRoom[] = $roomInfo->Details->EffectiveDate;
}
if(isset($roomInfo->Details->RoomRate)) {
if(isset($roomInfo->Details->RoomRate->EffectiveDate)) {
$thisRoom[] = $roomInfo->Details->RoomRate->EffectiveDate;
}
}
}
}
После того, как вы это сделаете, вы получите структуру $hotelInfo
, которая выглядит следующим образом:
array(
['Hotel Alpha'] => array(
[1860] => array('2011-08-12', '2011-08-13'),
[1861] => array('2011-08-12', '2011-08-13')
),
['Hotel Beta'] => array(
[1226] => array('2011-08-12', '2011-08-13'),
[1227] => array('2011-08-12', '2011-08-13')
)
)
С которым должно быть намного проще работать, и гораздо ближе к тому, что вы, похоже, хотите.