2012-03-06 41 views
7

Vì vậy, tôi đã làm việc với tập lệnh này để lặp qua các sự kiện từ một trang nhất định. Đột nhiên tôi thấy nó không hoạt động nữa: (Vòng lặp API đồ thị Facebook qua phân trang

Tôi có cảm giác đó có thể là một lỗi, vì nếu bạn chọn bất kỳ trang nào, xem sự kiện với access_token, bạn sẽ không thể lấy lại dữ liệu cho "tiếp theo "URL paginated. ví dụ như thử https://graph.facebook.com/evenightclub/events trong apigee.com

Bất kỳ ý tưởng?

($ fid là đối tượng trang 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"]); 
    }} 

Trả lời

6

mã của bạn làm việc cho tôi, điều duy nhất mà tôi đã làm là đảm bảo rằng số (dữ liệu $ ["dữ liệu"])> 0 trước khi hợp nhất với số đó isting thông tin. Vì vậy, có vẻ như sau:

//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, tôi vừa tìm kiếm vấn đề tương tự này. Vượt qua điều này và nghĩ "wow, đây là chính xác những gì tôi đang sau". Cuộn lên một chút và nhìn vào OP, "hmm, tôi nghĩ rằng tôi đã nhìn thấy mã này trước khi", nhìn vào tên người dùng, "huh". Câu trả lời của bạn hoạt động hoàn hảo bằng cách này, xin lỗi vì không đánh dấu nó một năm trước :) –

+1

bạn không phải đặt bù đắp như thế này: $ offset + = count ($ data ["data"]), trong trường hợp số lượng các mặt hàng thực tế được trả lại nhỏ hơn giới hạn $? trong trường hợp này, tôi không nghĩ FB trả lại 5.000 món hàng cho mỗi cuộc gọi. – rbp

Các vấn đề liên quan