2013-02-20 70 views
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++; 
    } 


} 

所以,理想情況下,我在看如何轉型,使上面會,只要有下一個頁面令牌運行。

回答

2

至少你可以用while代替if。也許可以將這個時間的主體重新分解爲一個函數。

但你不需要遞歸調用它,只是重複,直到你完成(即沒有更多的翻頁令牌)

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); 
} 
+0

感謝您的幫助Miky,大概應該已經想到這一點,但是大腦已經死亡搞清楚這個API .... – martincarlin87 2013-02-20 16:22:34

+0

這效果很好。添加睡眠函數是非常關鍵的,因爲當你的API太快時,google會返回一個INVALID_REQUEST。 2秒適合我的需求。 – 2014-09-30 02:56:07

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; 
} 

現在,您只需要循環,而該函數返回一些有用的東西。既然你想這樣做至少一次,我會用一個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 != '');