2013-02-20 5 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

По крайней мере, вы можете заменить if на 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); 
} 
+0

спасибо за вашу помощь Miky, вероятно, надо было думать о том, что но мозг мертв выяснить это апи .... – martincarlin87

+0

этот отлично работал. это было ключом для добавления функции сна, поскольку google возвращает INVALID_REQUEST, когда вы слишком быстро используете свой API. 2 секунды отлично работали для моих нужд. –

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 != ''); 
Смежные вопросы