【问题标题】:PHP Nested foreach with Key带键的 PHP 嵌套 foreach
【发布时间】:2016-09-29 09:01:46
【问题描述】:

我已经尝试解决这个问题两天了,但我遇到了障碍。我有一个 Skyscanner 数组,其中包含我有航班的航班路线

Leg - being Itineraries -> OutboundLegId - 

还有显示航班号的腿 - 是

Legs -> FlightNumbers -> FlightNumber.

我想要实现的是显示行程,然后将航班号加入其中。但无论我尝试什么,我都无法让它发挥作用。我已经在这里阅读了有关 Keys 的所有信息,并尝试了很多示例,但一无所获。有人能指出我正确的方向吗?

下面的示例数组

[Itineraries] => Array
(
    [0] => Array
        (
            [OutboundLegId] => 13542-1610140610-29-0-13445-1610141240
            [InboundLegId] => 13445-1610211340-29-0-13542-1610211640
            [PricingOptions] => Array
                (
                    [0] => Array
                        (
                            [Agents] => Array
                                (
                                    [0] => 2174187
                                )

                            [QuoteAgeInMinutes] => 31
                            [Price] => 200.98
                            [DeeplinkUrl] => http://partners.api.skyscanner.net/apiservices/deeplink/v2?_cje=5JlLCgyPUKY0hT8T0Ybh6dL0Xf0htAiHTFX7RU79eeI3XvrsxvEqP1QUJAoHiHRd&url=http%3a%2f%2fwww.apideeplink.com%2ftransport_deeplink%2f4.0%2fUK%2fen-gb%2fGBP%2fcook%2f2%2f13542.13445.2016-10-14%2c13445.13542.2016-10-21%2fair%2fairli%2fflights%3fitinerary%3dflight%7c-32294%7c1152%7c13542%7c2016-10-14T06%3a10%7c13445%7c2016-10-14T12%3a40%2cflight%7c-32294%7c1153%7c13445%7c2016-10-21T13%3a40%7c13542%7c2016-10-21T16%3a40%26carriers%3d-32294%26passengers%3d1%2c0%2c0%26channel%3ddataapi%26cabin_class%3deconomy%26facilitated%3dfalse%26ticket_price%3d200.98%26is_npt%3dfalse%26is_multipart%3dfalse%26client_id%3dskyscanner_b2b%26request_id%3d3bc96bda-fd7c-403a-b841-2ccc3c26071d%26commercial_filters%3dfalse%26q_datetime_utc%3d2016-09-29T08%3a18%3a27
                        )

[Legs] => Array
(
    [0] => Array
        (
            [Id] => 13542-1610140610-29-0-13445-1610141240
            [SegmentIds] => Array
                (
                    [0] => 1
                )

            [OriginStation] => 13542
            [DestinationStation] => 13445
            [Departure] => 2016-10-14T06:10:00
            [Arrival] => 2016-10-14T12:40:00
            [Duration] => 270
            [JourneyMode] => Flight
            [Stops] => Array
                (
                )

            [Carriers] => Array
                (
                    [0] => 105
                )

            [OperatingCarriers] => Array
                (
                    [0] => 105
                )

            [Directionality] => Outbound
            [FlightNumbers] => Array
                (
                    [0] => Array
                        (
                            [FlightNumber] => 1152
                            [CarrierId] => 105
                        )

                )

        )

【问题讨论】:

  • 请提供您想要达到的结果示例
  • 我可以看到两者之间的唯一链接是腿ID的前5个数字和起点/终点站。其余的似乎来自其他地方的结果数组。究竟是什么问题?
  • 我只需要加入 Itineraries -> OutboundLegId 和 Legs -> Id 上的两个数组,然后我就可以检索航班号。我有一个 foreach 循环,它可以毫无问题地遍历所有行程 - 但我不明白如何加入第二个数组
  • 行程 -> OutboundLegId 和 Legs -> Id 相同
  • 这两个是独立的数组还是都存在于一个大数组中

标签: php foreach key skyscanner


【解决方案1】:

假设这是一个大数组,它被称为 $data,您可以嵌套几个 foreach 循环。

我使用 foreach 循环,因为我假设在某些情况下此数据结构比您展示的更复杂

foreach ( $data['Itineraries'] as $itin ) {

    foreach ( $data['Legs'] as $legs) {
        if ($legs['Id'] == $itin['OutboundLegId']) {

            // we matched the itinerary with a leg
            echo $legs['OutboundLegId'] . ' ' . $legs['FlightNumbers'][0]['FlightNumber'];

        }
    }
}

【讨论】:

  • 您可以使用 array_column 对您的数组之一进行排序 - 它允许您摆脱或嵌套 foreach。请参阅排序腿的示例。
  • @Dmytrechko 我假设如果必须问这个问题,那么像你的答案一样优雅的东西只会让 OP 感到困惑,所以我选择了简单
  • 哈哈。是的,简单是关键:-) 我会试一试,让你知道我是怎么做的。谢谢
  • @RiggsFolly 我同意你关于莫名其妙的看法。我只是尽量避免不必要的迭代。如果您的解决方案适用于 OP - 您可以提供替代选项。附言但是关于性能的问题仍然存在。我不确定使用 array_column 代替 foreach 是否有效。
  • 嗨 Riggs 我试过这个,虽然它没有抛出错误,但它没有返回任何数据(顺便说一下,数组被称为 $array :-))
【解决方案2】:

将其用作草稿。没有反馈就无法执行功能。 放置适当的数组而不是 {YOUR-ARRAY-WITH-LEGS} 和 {YOUR-ARRAY-WITH-ITINERARIES}

$sortedLegs = array_column('Id', {YOUR-ARRAY-WITH-LEGS});

$joinedArray = array_map(function($itinerary) use($sortedLegs){
    if(array_key_exists($itinerary['OutboundLegId'],$sortedLegs)) {
        $itinerary['legs'] = $sortedLegs[$itinerary['OutboundLegId']];
    }
  return $itinerary;
},{YOUR-ARRAY-WITH-ITINERARIES});

【讨论】:

  • 这会引发错误 Dmytrechko。如果有帮助,我的数组称为 $array?
  • 那么对于 {YOUR-ARRAY-WITH-LEGS} 我会用 {$array['Legs']['Id']} 替换 $array 作为数组名称吗?
  • 如果我对你的结构理解正确:而不是 {YOUR-ARRAY-WITH-LEGS} 使用 $array['Legs'];而不是 {YOUR-ARRAY-WITH-ITINERARIES} 使用 $array['Itineraries'];没有花括号
  • 谢谢。但不起作用。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多