0

誰かが私のスクリプトを微調整するのを手伝ってくれるかどうか疑問に思いました。

必要なものはありますが、再帰的にする方法を見つけようとしています。

例:私は現在持っています:

$key    = 'XXXXXXXXXXXX';
$sensor = 'false';
$query  = 'Place 1';

$url = 'https://maps.googleapis.com/maps/api/place/textsearch/json?key='.$key.'&query='.urlencode($query).'&sensor='.$sensor;

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$places = curl_exec($ch);
curl_close($ch);

// echo $url;

$output = json_decode($places);


$i = 0;


while ($output->results[$i]->geometry->location->lat != '') {
    echo '<strong>' . $query . '</strong><br />';
    echo $output->results[$i]->geometry->location->lat . ', '. $output->results[$i]->geometry->location->lng;
    echo '<br />' . $output->results[$i]->formatted_address;
    echo '<hr />';

    $i++;
}

// there is a delay between when the next page token is given and when it is ready to be accessed
sleep(5);

if ($output->next_page_token != '') {

    $url = 'https://maps.googleapis.com/maps/api/place/textsearch/json?pagetoken='.$output->next_page_token.'&key='.$key.'&sensor='.$sensor;

    // repeating myself now!

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $places = curl_exec($ch);
    curl_close($ch);

    $output = json_decode($places);

    $i = 0;

    while ($output->results[$i]->geometry->location->lat != '') {
        echo '<strong>' . $query . '</strong><br />';
        echo $output->results[$i]->geometry->location->lat . ', '. $output->results[$i]->geometry->location->lng;
        echo '<br />' . $output->results[$i]->formatted_address;
        echo '<hr />';

        $i++;
    }


}

したがって、理想的には、次のページのトークンがある限り上記が実行されるように再構築する方法を検討しています。

4

2 に答える 2

2

少なくとも、をに置き換えることができifますwhile。そして多分whileの本体を関数にリファクタリングします。

ただし、再帰的に呼び出す必要はなく、完了するまで(つまり、次のページのトークンがなくなるまで)繰り返し呼び出す必要があります。

function doQuery($url)
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $places = curl_exec($ch);
    curl_close($ch);

    $output = json_decode($places);

    $i = 0;

    while ($output->results[$i]->geometry->location->lat != '') {
        echo '<strong>' . $query . '</strong><br />';
        echo $output->results[$i]->geometry->location->lat . ', '. $output->results[$i]->geometry->location->lng;
        echo '<br />' . $output->results[$i]->formatted_address;
        echo '<hr />';

        $i++;
    }

    sleep(5);

    return $output->next_page_token;
}

$next_page_token = doQuery($url);

while ($next_page_token != '') 
{
   $url = 'https://maps.googleapis.com/maps/api/place/textsearch/json?pagetoken='.$next_page_token.'&key='.$key.'&sensor='.$sensor;

   $next_page_token = doQuery($url);
}
于 2013-02-20T16:18:22.733 に答える
1

ロジックを関数内にカプセル化し、次のページトークンがある間ループします。

function doWorkAndPrint( $url, $query) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $places = curl_exec($ch);
    curl_close($ch);

    $output = json_decode($places);

    $i = 0;

    while ($output->results[$i]->geometry->location->lat != '') {
        echo '<strong>' . $query . '</strong><br />';
        echo $output->results[$i]->geometry->location->lat . ', '. $output->results[$i]->geometry->location->lng;
        echo '<br />' . $output->results[$i]->formatted_address;
        echo '<hr />';

        $i++;
    }

    return $output->next_page_token;
}

ここで、その関数が何か有用なものを返す間、ループする必要があります。少なくとも1回は実行したいので、do ... whileループを使用します。

$key    = 'XXXXXXXXXXXX';
$sensor = 'false';
$query  = 'Place 1';

do {
    $url = 'https://maps.googleapis.com/maps/api/place/textsearch/json?pagetoken='.$query.'&key='.$key.'&sensor='.$sensor;
    $query = doWorkAndPrint( $url, $query);
} while( $query != '');
于 2013-02-20T16:23:29.840 に答える