【问题标题】:How to get more than 20 results ie. 60 using google place API with PHP?如何获得超过 20 个结果,即。 60 将google place API 与PHP 一起使用?
【发布时间】:2012-11-28 15:58:47
【问题描述】:

我正在开发一个 google Places API 应用程序,我的目标是获取特定查询的所有可用详细信息。但据我所知,google places API 一次只返回 20 个结果。但我需要所有可用的地点详细信息。

如果我多次使用搜索关键字搜索,它总是给出相同的结果。所以我想知道每次使用相同的关键字搜索时有什么方法可以得到不同的结果。

 <?php 
        $placeSearchURL = 'https://maps.googleapis.com/maps/api/place/textsearch/json?query=' . $query . '&sensor=true' . '&key=' . API_KEY;

        $placeSearchJSON = file_get_contents($placeSearchURL);
        $dataArray = json_decode($placeSearchJSON);
        $references = array();
        $detailsOfPlaces = array();

        if (isset($dataArray->status)) {
            switch ($dataArray->status) {
                case 'OK' :
                    foreach( $dataArray->results as $details) {
                        $references[] = $details->reference;
                    }
                    break;
                default:
                    echo "Something wrong";
            }
        }

        foreach ($references as $reference) {
            $placeDetailsURL = 'https://maps.googleapis.com/maps/api/place/details/json?reference=' . $reference . '&sensor=true&key=' . API_KEY;
            $placeDetails =file_get_contents($placeDetailsURL);
            $placeDetailsAsArray = json_decode($placeDetails);

            switch ($dataArray->status) {
                case 'OK' :
                    $detailsOfPlace['business_name'] = isset($placeDetailsAsArray->result->name) ? $placeDetailsAsArray->result->name : '';
                    $detailsOfPlace['address'] = isset($placeDetailsAsArray->result->formatted_address) ? $placeDetailsAsArray->result->formatted_address : '';                      

                    $detailsOfPlaces[] = $detailsOfPlace;
                    break;
                default:
                    echo "Something went wrong";
            }
        }

这是我的代码。它为每个查询返回 20 个结果。谁能告诉我应该做哪些调整才能为每个查询获得 60 个结果。

谢谢

【问题讨论】:

  • @shreks7 你能帮帮我吗?

标签: php google-places-api


【解决方案1】:

Google Places API 每次搜索最多可以返回 60 个结果,如果可以分成三页,最多 20 个结果。如果有超过 20 个结果可用,您可以通过将 next_page_token 传递给新搜索请求的 pagetoken 参数来访问其他结果。

有关添加结果的更多信息,请参阅文档中地点搜索页面的Accessing Addition Results 部分。

如果您只需要地点位置,您可以使用Places API Radar Search 返回最多 200 个地点位置。

编辑: 在您的示例中,您无需为每个地点发送详细信息请求即可访问地点名称和地址。此信息在初始响应中返回,可以像下面的示例一样访问:

foreach($dataArray->results as $place) {
  echo '<p><b>' . $place->name . '</b>, ' . $place->formatted_address . '</p>';
}

如果返回了next_page_token,您可以了解附近搜索请求是否有其他页面可用。这可以像下面这样检查:

if (isset($dataArray->next_page_token)) {
  //get next page
}

如果返回next_page_token,您可以通过将next_page_token 传递给新搜索请求的pagetoken 参数或将其附加到原始请求的末尾来获取下一页结果。下面是使用新请求的示例:

$placeSearchURL = 'https://maps.googleapis.com/maps/api/place/textsearch/json?nextpage=' . $dataArray->next_page_token . '&sensor=true' . '&key=' . API_KEY;

正如documentation 所说:

每页结果都必须依次显示。不应将两页或多页搜索结果显示为单页的结果 查询。

因此,在发出next_page_token 和它变为有效之间存在短暂的延迟。

【讨论】:

  • 我已经用代码和详细信息编辑了帖子。你能告诉我应该做些什么改变吗?
  • 这里解释了在 PHP 中使用 Places API 时如何访问addition results
  • ,我可以找到额外的结果,但是如何使用 php 分页查看它们
  • php分页是什么意思?如果用户要求查看更多,则向用户显示 20 个结果。获取下一页结果并将其显示给用户。
  • 是的,我就是想这样做。但不能这样做:(
【解决方案2】:

正如 Chris Green 在他的回答中所说,您必须使用分页来获得 20 多个结果。 此外,正如 Chris Green 还指出的那样,您不需要再次调用每个地方的参考地址。我假设您需要更多信息,所以我刚刚创建了 2 个函数来实现 Chris 在他的回复中所说的内容。 没有测试,所以可能会有一些错误,但你可以感受一下。

<?php

    function getAllReferences($query, $maxResults= 60, $nextToken = false) {
        $references = array();
        $nextStr = "";
        if ($nextToken)
            $nextStr = "nextpage=$nextToken";
        $placeSearchURL = "https://maps.googleapis.com/maps/api/place/textsearch/json?query=$query&sensor=true&key=".API_KEY."&$nextStr";
        $placeSearchJSON = file_get_contents($placeSearchURL);
        $dataArray = json_decode($placeSearchJSON);
        if (isset($dataArray->status) &&$dataArray->status == "OK") {
            foreach( $dataArray->results as $details) {
                array_push($references, $details->reference);
            }
            if (!empty($dataArray->next_page_token) && count($references) < $maxResults ) {
                $nextArray = getAllReferences($query, $maxResults-20 , $dataArray->next_page_token);
                $references = array_merge($references, $nextArray);

            }
            return $references;
        }
    }

    function getPlaceFromReference($reference) {
        $placeDetailsURL = 'https://maps.googleapis.com/maps/api/place/details/json?reference=' . $reference . '&sensor=true&key='.API_KEY;
        $placeDetailsContent =file_get_contents($placeDetailsURL);
        $placeDetails = json_decode($placeDetailsContent);
        if ($placeDetails->status == "OK")
            return $placeDetails;
        else return false;
    }

    $references = getAllReferences("test");
    if (count($references) == 0)
        echo "no results";
    else {
        foreach ($references as $reference) {
            $placeDetails = getPlaceFromReference($reference);
            print_r($placeDetails);
        }
    }

【讨论】:

  • tix3 获取它的好方法。有时我会收到此错误消息:array_merge(): Argument #2 is not an array ¿有什么帮助吗?
猜你喜欢
  • 2017-12-19
  • 2011-10-21
  • 2012-10-15
  • 2012-03-25
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多