2012年6月25日 星期一

Facebook PHP SDK 取得最關注您的好友

當初以為Facebook API 會提供這項功能,看來是想太多了。之前剛好有這需求,也去爬了文,剛好有看到這位 ""版主有寫過,就參考了這位版主寫的JavaScript概念下,用PHP寫成了類別,提供給需要的人使用。

參考網址:http://greenchiou.blogspot.tw/2010/12/facebook.html

一、使用方法

<?php

include_once "../fbinclude.php";//引入API(這就不貼了,可在前幾篇文章上找到)
include 'streamclass.php';//引入類別
$obj = new streamclsss();//建立新物件

/* 取得塗鴉牆上前一個禮拜 100則文章去做分析*/
try {
    $stream = "SELECT comments,likes FROM stream WHERE source_id = me()  and created_time < 1337939665 LIMIT 100 ";
    $streams = array(
        'method' => 'fql.query',
        'query' => $stream,
        'callback' => ''
    );
    $streamResult = $facebook->api($streams);
} catch (Exception $o) {
    p($o);
}
$user_count=$obj->StreamCounts($streamResult);//取得所有名單
$sort_user=$obj->sort_by_count($user_count,10);//取得最關注的前幾名並且排序
print_r($sort_user);
?>

二、streamclass.php

<?php

class streamclsss {

    public function StreamCounts($streamResult) {
        $user_count = array();
        for ($i = 0; $i < count($streamResult); $i++) {
            if (count($streamResult[$i]["comments"]["comment_list"]) > 0) {//文章回應統計
                for ($j = 0; $j < count($streamResult[$i]["comments"]["comment_list"]); $j++) {
                    //判斷使用者是否已經存在
                    if ($this->array_search_recursive($streamResult[$i]["comments"]["comment_list"][$j]["fromid"], $user_count)) {
                        //如果使用者已經存在,就在該使用者第一次出現的陣列位置 Count+1(回應次數)
                        $key = $this->array_search_key($streamResult[$i]["comments"]["comment_list"][$j]["fromid"], $user_count);
                        $user_count[$key]["count"]+=1;
                    } else {//如果不存在就產生新的陣列名單
                        $user_count[] = array(
                            "uid" => $streamResult[$i]["comments"]["comment_list"][$j]["fromid"],
                            "count" => 1
                        );
                    }
                }
            }
            if (count($streamResult[$i]["likes"]["friends"]) > 0) {//點讚次數統計
                for ($j = 0; $j < count($streamResult[$i]["likes"]["friends"]); $j++) {
                     //判斷使用者是否已經存在
                    if ($this->array_search_recursive($streamResult[$i]["likes"]["friends"][$j], $user_count)) {
                         //如果使用者已經存在,就在該使用者第一次出現的陣列位置 Count+1(回應次數)
                        $key = $this->array_search_key($streamResult[$i]["likes"]["friends"][$j], $user_count);
                        $user_count[$key]["count"]+=1;
                    } else {//如果不存在就產生新的陣列名單
                        $user_count[] = array(
                            "uid" => $streamResult[$i]["likes"]["friends"][$j],
                            "count" => 1
                        );
                    }
                }
            }
        }
        return $user_count;
    }

    public function sort_by_count($user_count, $num) {
        uasort($user_count, "my_sort");
        return array_splice($user_count, 0, $num);
    }

    public function array_search_recursive($needle, $haystack) {
        foreach ($haystack as $key => $val) {
            if ($val["uid"] == $needle) {
                return true;
            }
        }
    }

    public function array_search_key($needle, $haystack) {
        foreach ($haystack as $key => $val) {
            if ($val["uid"] == $needle) {
                return $key;
            }
        }
    }

}

function my_sort($a, $b) {//排序
    if ($a["count"] == $b["count"])
        return 0;
    return ($a["count"] > $b["count"]) ? -1 : 1;
}

?>



沒有留言: