2012-03-06 9 views
7

私はこのスクリプトを使用して、特定のページからのイベントをループしていました。突然、私はそれがもう動作しないことがわかります:(Facebook graph API loop through paging

私はそれがバグかもしれないという気持ちがあります。なぜなら、あなたがページを選んだら、access_tokenでイベントを見ると、 "次へ「ページ分割URL。例えば任意のアイデア?

($ FIDは、ページオブジェクトIDです)

try { 
    $facebook = new Facebook(array(
     'appId' => '<removed>', 
     'secret' => '<removed>', 
    )); 
    $access_token = $facebook->getAccessToken(); 

    $events_data = array(); 
    $offset = 0; 
    $limit = 5000; 
    $params = array('access_token' => $access_token); 

    //fetch events from Facebook API 
    $data = $facebook->api("$fid/events/?limit=$limit&offset=$offset", $params); 
    $events_data = array_merge($events_data, $data["data"]); 

    //loop through pages to return all results 
    while(in_array("paging", $data) && array_key_exists("next", $data["paging"])) { 
     $offset += $limit; 
     $data = $facebook->api("$fid/events/?limit=$limit&offset=$offset", $params); 
     $events_data = array_merge($events_data, $data["data"]); 
    }} 

答えて

6

あなたのコードapigee.com

https://graph.facebook.com/evenightclub/eventsを試すには、私がやった唯一の事、私の作品count($ data ["data"])> 0を前にマージする前にそれを確認することです情報を求めている。だから、このようになります:

//loop through pages to return all results 
while(in_array("paging", $data) && array_key_exists("next", $data["paging"])) { 
    $offset += $limit; 
    $data = $facebook->api("$fid/events/?limit=$limit&offset=$offset", $params); 
    // make sure we do not merge with an empty array 
    if (count($data["data"]) > 0){ 
     $events_data = array_merge($events_data, $data["data"]); 
    } else { 
     // if the data entry is empty, we have reached the end, exit the while loop 
     break; 
    } 
}} 
+3

Heh、私はちょうど同じ問題を探していました。これを見つけて、「うわー、これはまさに私が後にしていることだ」と思った。ちょっと上にスクロールしてOPを見て、 "うーん、私は前にこのコードを見たと思う"と、ユーザー名 "huh"を見ます。あなたの答えは、1年前にそれをマーキングしていないことについての謝罪です。 –

+1

このようにオフセットを設定する必要はありません:$ offset + = count($ data ["data"])返される実際のアイテムは$ limit未満ですか?この場合、私はFBがすべての呼び出しで5,000アイテムを返すとは思わない。 – rbp