2012-04-18 3 views
0

Я нахожусь в логическом контроле над тем, как реализовать что-то, что я делаю. Я работаю с API-интерфейсом Instagram (не важно для этого вопроса), и в ответе JSON они дают вам 20 результатов и ссылку на следующие 20 результатов. Я пытаюсь создать библиотеку ООП, которая может получить ответ от первоначального вызова API, выполнить поиск, если у него есть значение «next_url», и если это произойдет, получите следующие 20 ответов и так далее, пока не появится следующий URL-адрес , Я не могу достаточно собрать логику о том, как это сделать ...Looping logic on JSON

В настоящее время здесь код, чтобы получить первый 20 ...

function __apiCall($url, $post_parameters = FALSE) { 

     $curl_session = curl_init(); 

     curl_setopt($curl_session, CURLOPT_URL, $url); 

     if($post_parameters !== FALSE) { 
      curl_setopt ($curl_session, CURLOPT_POSTFIELDS, $post_parameters); 
     } 

     // Return the curl results to a variable 
     curl_setopt($curl_session, CURLOPT_RETURNTRANSFER, 1); 

     curl_setopt($curl_session, CURLOPT_SSL_VERIFYPEER, $this->codeigniter_instance->config->item('instagram_ssl_verify')); 

     $contents = curl_exec ($curl_session); 

     curl_close ($curl_session); 

     $return = json_decode($contents); 
     return $return; 


    } 

и вот отрывок из ответа JSON .. ..

stdClass Object 
(
    [pagination] => stdClass Object 
     (
      [next_url] => https://api.instagram.com/v1/locations/3937885/media/recent?min_timestamp=&min_id=&max_timestamp=&access_token=xxxxxxxxxxxx49414762bea69258210d8872&max_id=133226850290424667_21341717 
      [next_max_id] => 133226850290424667_21341717 
     ) 

    [meta] => stdClass Object 
     (
      [code] => 200 
     ) 

    [data] => Array 
     (
      [0] => stdClass Object 
       (
        [tags] => Array 
         (
         ) 

        [type] => image 
        [location] => stdClass Object 
         (
          [latitude] => 39.95022 
          [name] => Neiman Group 
          [longitude] => -75.168322 
          [id] => 3937885 
         ) 

        [comments] => stdClass Object 
         (
          [count] => 0 
          [data] => Array 
           (
           ) 

         ) 
+0

«Я пытаюсь создать библиотеку ООП» Где ООП? :) – PeeHaa

+0

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

+0

Что содержит 'post_parameters'. Вам также нужно это в дальнейшем вызове? – PeeHaa

ответ

2
function getResults($url) 
{ 
    $gotAllResults = false; 
    $results = array(); 

    while(!$gotAllResults) { 
     $result = $this->__apiCall($url); 
     $results[] = $result; 

     if (!property_exist($result->pagination, 'next_url') { 
      $gotAllResults = true; 
     } else { 
      $url = $result->pagination->next_url; 
     } 
    } 

    return $results; 
} 

function __apiCall($url) 
{ 
     // settings for cURL 

     $contents = curl_exec($curl_session); 

     curl_close ($curl_session); 

     $result = json_decode($contents); 
     return $return; 
} 

BTW. Почему вы используете два символа подчеркивания в имени вашей функции __apiCall. Это заставляет меня думать, что происходит magical.

+0

Dude awesome, Спасибо, было несколько опечаток, которые я исправил, но вы, мужчина ... Я отвечу с моим окончательным ... –

+0

@GThompson Glad Я мог бы помочь и извиниться за опечатки. Было бы не очень весело, если бы это сработало ;-) – PeeHaa

0
function __apiCall($url, $post_parameters = FALSE) { 

     // Initialize the cURL session 
     $curl_session = curl_init(); 

     // Set the URL of api call 
     curl_setopt($curl_session, CURLOPT_URL, $url); 

     // If there are post fields add them to the call 
     if($post_parameters !== FALSE) { 
      curl_setopt ($curl_session, CURLOPT_POSTFIELDS, $post_parameters); 
     } 

     // Return the curl results to a variable 
     curl_setopt($curl_session, CURLOPT_RETURNTRANSFER, 1); 

     // There was issues with some servers not being able to retrieve the data through https 
     // The config variable is set to TRUE by default. If you have this problem set the config variable to FALSE 
     // See https://github.com/ianckc/CodeIgniter-Instagram-Library/issues/5 for a discussion on this 
     curl_setopt($curl_session, CURLOPT_SSL_VERIFYPEER, $this->codeigniter_instance->config->item('instagram_ssl_verify')); 

     // Execute the cURL session 
     $contents = curl_exec ($curl_session); 

     // Close cURL session 
     curl_close ($curl_session); 

     // Return the response 
     return json_decode($contents); 


    } 

    function getResults($url){ 

     $gotAllResults = false; 
     $results = array(); 

     while(!$gotAllResults) { 
     $result = $this->__apiCall($url); 
     $results[] = $result; 

     if (!property_exists($result->pagination, 'next_url')) { 
      $gotAllResults = true; 
     } else { 
      $url = $result->pagination->next_url; 
     } 
    } 

    return $results; 

    }