Создание нового массива из цикла другого массива
Мне нужно привести в порядок массив. И собрать всю подобную информацию вместе.
Это будет огромный заказ, который я принесу на стол, однако, он выходит за рамки моих навыков, и я пытался исправить это в течение 3 дней.
Сообщение исходит от веб-службы, которая не имеет никакого контроля над выводом / ответом.
Я должен быть в состоянии поместить всю информацию, но следующее (я знаю его большое сожаление) является ответом объекта SOAP: (это было уменьшено также) eek.
[0] => RoomInformation Object
(
[Details] => DetailsType Object
(
[Total] => TotalType Object
(
[AmountAfterTax] => 1.00
)
[EffectiveDate] => 2011-08-12
[AvailabilityStatus] => AvailableForSale
)
[RoomInformationExtend] => TPA_ExtensionsType Object
(
[RoomDetails] => RoomDetails Object
(
[RoomId] => 1860
[RoomNo] => THAH01
[Description] => Hotel Alpha
)
)
)
[1] => RoomInformation Object
(
[Details] => DetailsType Object
(
[RoomRate] => RoomRateType Object
(
[Total] => TotalType Object
(
[AmountAfterTax] => 1.00
)
[EffectiveDate] => 2011-08-12
[AvailabilityStatus] => AvailableForSale
)
)
[RoomInformationExtend] => TPA_ExtensionsType Object
(
[RoomDetails] => RoomDetails Object
(
[RoomId] => 1861
[RoomNo] => THAH02
[Description] => Hotel Alpha
)
)
)
[2] => RoomInformation Object
(
[Details] => DetailsType Object
(
[RoomRate] => RoomRateType Object
(
[Total] => TotalType Object
(
[AmountAfterTax] => 1.00
)
[EffectiveDate] => 2011-08-12
[AvailabilityStatus] => AvailableForSale
)
)
[RoomInformationExtend] => TPA_ExtensionsType Object
(
[RoomDetails] => RoomDetails Object
(
[Amenities] => stdClass Object
(
)
[Configurations] => stdClass Object
(
)
[RoomId] => 1226
[RoomNo] => DENM01
[Description] => Hotel Beta
)
)
)
[3] => RoomInformation Object
(
[Details] => DetailsType Object
(
[RoomRate] => RoomRateType Object
(
[Total] => TotalType Object
(
[AmountAfterTax] => 1.00
)
[EffectiveDate] => 2011-08-12
[AvailabilityStatus] => AvailableForSale
)
[MoreRatesExistInd] =>
)
[RoomInformationExtend] => TPA_ExtensionsType Object
(
[RoomDetails] => RoomDetails Object
(
[Amenities] => stdClass Object
(
)
[Configurations] => stdClass Object
(
)
[RoomId] => 1227
[RoomNo] => DENM02
[Description] => Hotel Beta
)
)
)
[4] => RoomInformation Object
(
[Details] => DetailsType Object
(
[Total] => TotalType Object
(
[AmountAfterTax] => 1.00
)
[EffectiveDate] => 2011-08-13
[AvailabilityStatus] => AvailableForSale
)
[RoomInformationExtend] => TPA_ExtensionsType Object
(
[RoomDetails] => RoomDetails Object
(
[RoomId] => 1860
[RoomNo] => THAH01
[Description] => Hotel Alpha
)
)
)
[5] => RoomInformation Object
(
[Details] => DetailsType Object
(
[RoomRate] => RoomRateType Object
(
[Total] => TotalType Object
(
[AmountAfterTax] => 1.00
)
[EffectiveDate] => 2011-08-13
[AvailabilityStatus] => AvailableForSale
)
)
[RoomInformationExtend] => TPA_ExtensionsType Object
(
[RoomDetails] => RoomDetails Object
(
[RoomId] => 1861
[RoomNo] => THAH02
[Description] => Hotel Alpha
)
)
)
[2] => RoomInformation Object
(
[Details] => DetailsType Object
(
[RoomRate] => RoomRateType Object
(
[Total] => TotalType Object
(
[AmountAfterTax] => 1.00
)
[EffectiveDate] => 2011-08-13
[AvailabilityStatus] => AvailableForSale
)
)
[RoomInformationExtend] => TPA_ExtensionsType Object
(
[RoomDetails] => RoomDetails Object
(
[Amenities] => stdClass Object
(
)
[Configurations] => stdClass Object
(
)
[RoomId] => 1226
[RoomNo] => DENM01
[Description] => Hotel Beta
)
)
)
[3] => RoomInformation Object
(
[Details] => DetailsType Object
(
[RoomRate] => RoomRateType Object
(
[Total] => TotalType Object
(
[AmountAfterTax] => 1.00
)
[EffectiveDate] => 2011-08-13
[AvailabilityStatus] => AvailableForSale
)
[MoreRatesExistInd] =>
)
[RoomInformationExtend] => TPA_ExtensionsType Object
(
[RoomDetails] => RoomDetails Object
(
[Amenities] => stdClass Object
(
)
[Configurations] => stdClass Object
(
)
[RoomId] => 1227
[RoomNo] => DENM02
[Description] => Hotel Beta
)
)
)
TL; DR
В каждом отеле есть 2 номера с идентификаторами. Каждый из этих 2 идентификаторов разделен датами, но находится в разных частях массива:(
[Hotel A]
HotelA RoomId = 01
Date = 12-08-2011
[Hotel A]
HotelA RoomId = 02
Date = 12-08-2011
[Hotel B]
HotelB RoomId = 01
Date = 12-08-2011
[Hotel B]
HotelB RoomId = 02
Date = 12-08-2011
[Hotel A]
HotelA RoomId = 01
Date = 13-08-2011
[Hotel A]
HotelA RoomId = 02
Date = 13-08-2011
[Hotel B]
HotelB RoomId = 01
Date = 13-08-2011
[Hotel B]
HotelB RoomId = 02
Date = 13-08-2011
Я хочу иметь возможность поместить их в массив как таковой:
[Hotel A]
HotelA RoomId = 01
Date 12-08-2011
Date 13-08-2011
HotelA RoomId = 02
Date 12-08-2011
Date 13-08-2011
так далее
Пожалуйста помоги. Я вырывал свои волосы:(
Вот пример того, что я попробовал:
$hotelinfo = array();
$k=0;
for($i = 0; $i < count($result->RoomInformation); $i++)
{
$flag = false;
$HotelObj = $result->RoomInformation[$i];
$HotelName = $result->RoomInformation[$i]->RoomInformationExtend->RoomDetails->Description;
$HotelId = $result->RoomStays->RoomStay[$i]->RoomInformation->RoomDetails->RoomId;
//$hotelinfo[$i][$HotelName] = array();
$hotelinfo[count($hotelinfo)] = array();
$hotelinfo[count($hotelinfo)][$HotelName] = array();
for($c = 0; $c < count($result->RoomInformation); $c++)
{
$thishotelObj = $result->RRoomInformation[$c];
$thisHotelName = $thishotelObj->RoomInformationExtend->RoomDetails->Description;
$thisHotelId = $thishotelObj->TPA_Extensions->RoomDetails->RoomId;
if($thisHotelName == $HotelName & $thisHotelId == $HotelId){
$hotelinfo[$i][$HotelName][$c] = $HotelName;
$hotelinfo[$i][$HotelName][$c] = $thisHotelName;
$i++;
}
}
}
я даже иду в правильном направлении с этим?
2 ответа
Когда вы делаете это...
$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')
)
)
С которым должно быть намного легче работать, и намного ближе к тому, что вы, кажется, хотите.
Я полагаю, что такой цикл foreach будет достаточно. PHP не проверяет наличие элементов массива при обновлении, поэтому он просто добавил бы необходимые ключи.
$HotelRooms = array();
$foreach($result as $r)
{
$HotelName = $r->RoomInformationExtend->RoomDetails->Description;
$HotelRooms[$HotelName][$r->RoomInformationExtend->RoomDetails->RoomId][] = $r->Details->EffectiveDate
}