【问题标题】:Creating new array from looping another array通过循环另一个数组创建新数组
【发布时间】:2011-01-23 05:12:56
【问题描述】:

我需要整理一个数组。并将所有类似的信息收集在一起。

这将是我提出的一个巨大订单,但是,它远远超出了我的技能范围,我已经尝试修复它 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 间带 id 的房间。这 2 个 id 中的每一个都由日期分隔,但位于数组的不同部分:(

[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++;                           
        }
    }
}

我是不是朝着正确的方向前进?

【问题讨论】:

    标签: php multidimensional-array recreate


    【解决方案1】:

    我想这样的 foreach 循环就足够了。 PHP 在更新时不会检查数组成员的存在,所以它只会添加所需的键。

    $HotelRooms = array();
    $foreach($result as $r)
    {
      $HotelName = $r->RoomInformationExtend->RoomDetails->Description;
      $HotelRooms[$HotelName][$r->RoomInformationExtend->RoomDetails->RoomId][] = $r->Details->EffectiveDate
    }
    

    【讨论】:

    • 将需要更多的代码,因为并非所有的 EffectiveDates 都在每条记录中的相同位置。有关详细信息,请参阅我的答案。
    【解决方案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 都是新的)。

    从你的代码来看,我认为这不是你想要的。


    加倍努力(或两英里)...

    我认为您可能首先要做的是将数据转换为更可用的格式 - 首先按酒店分组,然后按房间 ID 分组。所以,让我们这样做:

    $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')
        )
    )
    

    这应该更容易使用,并且更接近您似乎想要的。

    【讨论】:

    • 肯定不是 :( 会做出相应的改变
    • 是女士,但是因为我感觉很好,请看上面添加的部分。
    • 非常感谢并原谅我。感谢您竭尽全力帮助我。
    • 我的错,没有看到不同的数据格式,因为 iPad 剪辑的代码 div 溢出。有时很烦人。
    • 嗨 Amber,我尝试了代码,但我想我遗漏了一些东西,我返回了酒店名称,但每个酒店的数组中没有任何内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 2012-12-16
    • 2019-08-28
    相关资源
    最近更新 更多