如何在嵌套数组中找到一个值,然后返回该父级?

时间:2019-04-08 17:44:48

标签: php arrays api google-maps-api-3

我要从Google Maps API返回一个嵌套数组。我想做的是在数组中找到某种类型。我正在使用json_decode将结果从JSON转换为PHP。 这是返回的响应:

Array
(
[results] => Array
    (
        [0] => Array
            (
                [address_components] => Array
                    (
                        [0] => Array
                            (
                                [long_name] => 78210
                                [short_name] => 78210
                                [types] => Array
                                    (
                                        [0] => postal_code
                                    )

                            )

                        [1] => Array
                            (
                                [long_name] => San Antonio
                                [short_name] => San Antonio
                                [types] => Array
                                    (
                                        [0] => locality
                                        [1] => political
                                    )

                            )

                        [2] => Array
                            (
                                [long_name] => Bexar County
                                [short_name] => Bexar County
                                [types] => Array
                                    (
                                        [0] => administrative_area_level_2
                                        [1] => political
                                    )

                            )

                        [3] => Array
                            (
                                [long_name] => Texas
                                [short_name] => TX
                                [types] => Array
                                    (
                                        [0] => administrative_area_level_1
                                        [1] => political
                                    )

                            )

                        [4] => Array
                            (
                                [long_name] => United States
                                [short_name] => US
                                [types] => Array
                                    (
                                        [0] => country
                                        [1] => political
                                    )

                            )

                    )

                [formatted_address] => San Antonio, TX 78210, USA
                [geometry] => Array
                    (
                        [bounds] => Array
                            (
                                [northeast] => Array
                                    (
                                        [lat] => 29.418426
                                        [lng] => -98.422923
                                    )

                                [southwest] => Array
                                    (
                                        [lat] => 29.374093
                                        [lng] => -98.499778
                                    )

                            )

                        [location] => Array
                            (
                                [lat] => 29.3979578
                                [lng] => -98.4677851
                            )

                        [location_type] => APPROXIMATE
                        [viewport] => Array
                            (
                                [northeast] => Array
                                    (
                                        [lat] => 29.418426
                                        [lng] => -98.422923
                                    )

                                [southwest] => Array
                                    (
                                        [lat] => 29.374093
                                        [lng] => -98.499778
                                    )

                            )

                    )

                [place_id] => ChIJy9U5Yzj2XIYRRhV9xWIghyU
                [types] => Array
                    (
                        [0] => postal_code
                    )

            )

    )

[status] => OK
)

我需要做的是找到某种类型并返回long_nameshort_name。我希望这是有道理的。

所以基本上,如果类型=政治的,那么返回整个数组,这样我就可以访问long_name和short_name。

我尝试使用array_search,但没有得到任何结果。

任何帮助,我们将不胜感激!

2 个答案:

答案 0 :(得分:1)

这将返回找到的第一个数组:

foreach($array['results'][0]['address_components'] as $v) {
    if(is_array($v['types']) && in_array('political', $v['types'])) {
        $result = $v;
        break;
    }
}

如果要多个,请使用$result[] = $v;并删除break

答案 1 :(得分:0)

您可以使用array_map函数

$arr = array(
  0 => array(
     'long_name'  => 'Bexar County',
     'short_name' => 'Bexar County',
     'types' => array(
        0 => 'administrative_area_level_2',
        1 => 'political'
     )
   )   
);

$findType = 'political';
$result = array_map(function($v) use ($findType){
      if(in_array($findType, $v['types'])) 
        return $v;
}, $arr);

结果:

Array
(
  [0] => Array
    (
        [long_name] => Bexar County
        [short_name] => Bexar County
        [types] => Array
            (
                [0] => administrative_area_level_2
                [1] => political
            )
    )
 )