Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 来自谷歌API的一致结果_Php_Arrays_Json - Fatal编程技术网

Php 来自谷歌API的一致结果

Php 来自谷歌API的一致结果,php,arrays,json,Php,Arrays,Json,使用GoogleAPI根据纬度和经度从两个选项中的一个确定县,结果不一致。一个给县下键2;另一个钥匙是4。在这种不一致的情况下,我如何获取所需的信息 我只使用过几次Json,所以可能我误解了如何检索值,所以这里是我的PHP函数,用于解析它: function getCounty($LatLong) { global $googlekey; $url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=$LatLo

使用GoogleAPI根据纬度和经度从两个选项中的一个确定县,结果不一致。一个给县下键2;另一个钥匙是4。在这种不一致的情况下,我如何获取所需的信息

我只使用过几次Json,所以可能我误解了如何检索值,所以这里是我的PHP函数,用于解析它:

function getCounty($LatLong) {
    global $googlekey;
    $url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=$LatLong&key=$googlekey";
    $json = @file_get_contents($url);
    $data = json_decode($json);
    $status = $data->status;
    if ($status === "OK") :
        //return $data->results[0]->address_components[2]->long_name;
        return $data->results[0]->address_components[4]->long_name;
    else :
        return FALSE;
    endif;
}
换句话说,要获得一个县的名称,需要:

返回$data->results[0]->address\u components[2]->long\u name

。虽然需要此项才能获取其他县的名称:

返回$data->results[0]->address\u components[4]->long\u name

这违背了试图动态查找它在哪个县使用的目的

使用Json对其进行解析,给出一个县的部分输出片段,其中县的键为2

[2] => stdClass Object
    (
        [long_name] => Santa Cruz County
        [short_name] => Santa Cruz County
        [types] => Array
            (
                [0] => administrative_area_level_2
                [1] => political
            )

    )

[3] => stdClass Object
    (
        [long_name] => California
        [short_name] => CA
        [types] => Array
            (
                [0] => administrative_area_level_1
                [1] => political
            )

    )

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

    )
。另一个县的密钥为4:

[2] => stdClass Object
    (
        [long_name] => West Valley
        [short_name] => West Valley
        [types] => Array
            (
                [0] => neighborhood
                [1] => political
            )

    )

[3] => stdClass Object
    (
        [long_name] => San Jose
        [short_name] => San Jose
        [types] => Array
            (
                [0] => locality
                [1] => political
            )

    )

[4] => stdClass Object
    (
        [long_name] => Santa Clara County
        [short_name] => Santa Clara County
        [types] => Array
            (
                [0] => administrative_area_level_2
                [1] => political
            )

    )

话虽如此,有没有办法直接从IP地址获取县?我在某个地方看到谷歌对此表示不满,但在谷歌API文档中,我看到了使用IP的参考资料,但没有任何例子,因此它对如何使用IP含糊其辞。

正如@enricog所说;您需要的是根据特定类型提取值

根据文件:

以下是您可以做的一个想法:

$data=json\u解码$json; $countries=[]; foreach$data->results as$result{ $countries=array\u merge$countries,array\u filter$result->address\u组件,函数$address{ 返回数组'administration\u area\u level\u 2',$address->types; }; } $countries=数组_映射函数$country{ 返回$country->long\u name; },$个县; echo内爆“,”,$countries; 我不使用GoogleMapAPI,我不知道是否可以在响应中包含多个县。JSON结构允许它,我想,根据请求的内容,它可能会有一些。 我在json中添加了虚构的值来验证这个原则

我相信这个片段是可以优化的。但至少它会从响应中返回每个县,并且不会得到未定义的索引

复习

在使用了一点API之后,我现在可以更精确地回答问题了。但这只是我的猜测。 当您请求位置时,它将返回许多靠近您位置的已知位置。第一个结果应该总是离你最近的

谷歌注释:反向地理编码不是一门精确的科学。地理编码器将尝试在一定公差范围内找到最近的可寻址位置

在此基础上,我们可以优化代码,使其只有一个结果,即正确的县

function getCounty($LatLong) {
    // do stuff
    $data = json_decode($json);
    $counties = [];

    if(!empty($data->results)){
        $counties = array_merge($counties, array_filter($data->results[0]->address_components, function ($address) { 
            return in_array('administrative_area_level_2', $address->types);
        })); 
    }

    if(!empty($counties)){
        return reset($counties)->long_name; // https://stackoverflow.com/a/3771228/8068675
    }
    return 'No county found';
}

我确实读过,你没有使用PHP7。但是,我将保持这段代码与PHP7的兼容性,因为它不应该再被使用。

使用Cbaconier的循环并限制它只运行一次,它现在可以工作了!请注意,$countries=[];我在本地PHP7.2开发系统上工作,但没有在live server上的旧版本PHP上工作,因此我将其更改为$countries=array

谢谢你的帮助。现在,如果有一种方法可以直接从IP做,我想知道它是什么

function getCounty($LatLong) {
    global $googlekey;

    $url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=$LatLong&key=$googlekey";
    $json = @file_get_contents($url);
    $data = json_decode($json);
    $status = $data->status;
    if ($status === "OK") :
        //$counties = []; // for later PHP versions but does not work on live server
        $counties = array();

        $i = 0;
        foreach (range(1, 1)  as $i) :
            foreach($data->results as $result) :
                if ($i++ > 1) break;
                $counties = array_merge($counties, array_filter($result->address_components, function ($address) { 
                    return in_array('administrative_area_level_2', $address->types);
                })); 
            endforeach;
        endforeach;

        $counties = array_map(function ($county) { 
            return $county->long_name;
        }, $counties);

        return $counties[0];

    else :
        return FALSE;
    endif;
}

我不明白你的问题。你能详细说明一下吗?这个问题是我需要使用return$data->results[0]->address\u components[2]->long\u name;查看一个县并返回$data->results[0]->address\u components[4]->long\u name;看到另一个,所以它的动态不够有用。注意,2和4个键是不同的,一个调出一个县,另一个调出另一个县,因此GoogleAPI根据位置对相同的值使用不同的键。这不可能是正确的,因此必须有其他方法来获得一致的结果。根据文档,API可以返回多个结果。您需要的是根据特定类型提取值。看见因此,您可以循环搜索结果,只提取包含通缉类型的结果。为了清楚起见,我要查找的是县,而不是国家。这个国家永远是美国。@DonP对不起,我想念里德。在这种情况下,您可以使用return strpos$address->long\u name,'country'!=错误的逻辑是一样的。我也不知道地址提前-这应该是自动的,当我从一个县到另一个县时,从一个县到另一个县。如果它可以直接从IP上完成会更好,但如果这不可能,那么就像我现在做的那样,通过纬度和经度。这样做需要另一个我不想使用的第三方插件,但显然我没有选择,尽管我对想法持开放态度。你的意思是,在这种情况下,你想要行政区级别2?从我最初的代码片段中,将country替换为administrative\u area\u level\u 2Not geting errors,but not geting output。$address变量的作用是什么?顺便说一句,这种需要
it’我只想说一个县,而不是全部,而且必须是我当时所在的县。@CBA我可能说得太快了。如果我使用echo$county->long\u name;它按预期显示在屏幕上,但如果我使用return$country->long\u name;函数不产生任何输出。返回$country->long\u name;您可以看到在闭包中返回long_名称。了解如何从函数返回$countries。从我的例子来看,它包含了一个数组中的所有长_名称。谢谢,我更正了上面的帖子以反映更正。我感谢你的帮助。它现在在一个县运行得很好,在接下来的一个小时左右,我将在另一个县再次测试它,但我不期待任何惊喜。这是可能的,我想,因为它使用IP为它提供一个附近的县,而不是我所在的县,但一旦我看到它可能会得到哪些县,我就可以对它进行编程以忽略它们,就像我在调用函数的县所做的那样。