2011-12-04 79 views
3

我想找到我與朋友分享的朋友人數最多的朋友。
我試着用FQL和圖形API做了以下方法:共同朋友人數最多的朋友

  1. 獲取登錄的用戶當前的好友列表。
    FQL:SELECT uid1 FROM friend WHERE uid2="MY_USER_ID" and uid1 IN (SELECT uid1 FROM friend WHERE uid2=me())
    圖形API:$facebook->api('/me/friends?format=json&limit=5000')

  2. 對於UID在列表中的每一個,我可以得到共同的朋友列表中又算什麼呢。
    FQL:SELECT uid1 FROM friend WHERE uid2="OTHER_USER" and uid1 IN (SELECT uid1 FROM friend WHERE uid2=me())
    圖形API:$facebook->api('me/mutualfriends/OTHER_USER')

無論其,它需要大量時間通過我所有的朋友來運行這個...
你熟悉一個更好的方式做那?

回答

0

我不確定你到底想要達到什麼目的。但是,如果您在列表中尋找最好的朋友,您可以通過提取Feed來實現這一目標,然後根據帖子數量對朋友排名。

$fql="SELECT actor_id FROM stream WHERE filter_key = 'others' AND source_id = me() ORDER BY actor_id LIMIT 3000"; 
$param=array(
      'method' => 'fql.query', 
      'query'  => $fql, 
      'callback' => '' 
     ); 
     $fqlResult1 = $this->facebook->api($param); 
     $top_frds=array(); 
     foreach($fqlResult1 as $result1) 
     { 
      $top_frds[]=$result1['actor_id']; 
     } 


$new_array = array(); 
foreach ($top_frds as $key => $value) { 
if(isset($new_array[$value])) 
    $new_array[$value] += 1; 
else 
    $new_array[$value] = 1; 
} 
$top_frds=array(); 
foreach($new_array as $tuid => $trate) 
{ 
$top_frds[]=array('uid'=>$tuid,'rate'=>$trate); 
} 
+0

Sandy&@talonmies:我返回的數組按用戶標識排序,而不是按'速率'值排序。 另一件事,它並不侷限於我現在的朋友,這意味着沒有和我交往的用戶在列表中。 –

+0

按'費率'排序可能是這樣的: http://www.firsttube.com/read/sorting-a-multi-dimensional-array-with-php/ 但我仍然需要第二個問題的解決方案。 –

3

我已經使用了這樣的查詢來獲得共同的朋友:

SELECT uid1, uid2 FROM friend 
    WHERE uid1 IN 
    (SELECT uid2 FROM friend WHERE uid1=me()) 
    AND uid2 IN 
    (SELECT uid2 FROM friend WHERE uid1=me()) 

它迅速返回所有的朋友的共同朋友。

+0

傑夫的建議可能會讓你儘可能的使用FQL。一旦你得到了這個查詢的結果,找到相互連接數最多的朋友應該相當簡單。只要找到結果中最常出現的uid,那就是你的答案。 –

+0

Geoff,你建議的查詢返回一個帶有uid對的JSON對象。像:{ 「UID1」: 「22069X」, 「UID2」: 「71286421X」 },{ 「UID1」: 「22091X」, 「UID2」: 「22498X」 } @Zachary - 這不是我我不知道如何從這些信息中提取哪一位我的朋友分享了最多的相互聯繫。 –

+0

請參閱[我的新答案](http://stackoverflow.com/a/8828048/988990)。 –

4

以下是Geoff的答案,下面是PHP中的一個完整解決方案。

首先,這裏是傑夫的FQL:

SELECT uid1, uid2 FROM friend 
    WHERE uid1 IN 
    (SELECT uid2 FROM friend WHERE uid1=me()) 
    AND uid2 IN 
    (SELECT uid2 FROM friend WHERE uid1=me()) 

這裏是PHP代碼檢索JSON和檢查哪個朋友有最共同的朋友和你在一起。 (請確保您更換您的訪問令牌的網址。)

<?php 
$jsonurl = "https://api.facebook.com/method/fql.query?query=SELECT+uid1%2C+uid2+FROM+friend++%0A++WHERE+uid1+IN+%0A++%28SELECT+uid2+FROM+friend+WHERE+uid1%3Dme%28%29%29%0A+++AND+uid2+IN+%0A++%28SELECT+uid2+FROM+friend+WHERE+uid1%3Dme%28%29%29&access_token=***INSERTACCESSTOKENHERE***&format=json"; 
$json = file_get_contents($jsonurl,0,null,null); 
$json_output = json_decode($json,true); 

for ($friendship = 0; $friendship <= count($json_output); $friendship++) 
{ 
    $firstfriend = $json_output[$friendship]["uid1"]; 
    $mutualfriendscount[$firstfriend] = isset($mutualfriendscount[$firstfriend]) ? $mutualfriendscount[$firstfriend] + 1 : 1; 
} 

$mostmutualfriends_count = 0; 

foreach ($mutualfriendscount as $friend => $mutualfriendcount) 
{ 
    if ($mutualfriendcount > $mostmutualfriends_count) 
    { 
     $mostmutualfriends_count = $mutualfriendcount; 
     $mostmutualfriends_id = $friend; 
    } 
} 
echo "ID $mostmutualfriends_id has the most number of mutual friends with you: $mostmutualfriends_count." 

?> 
9

如果你的目標只是爲了得到朋友的共同朋友最多的,即一個列表,你不關心誰那些共同的朋友是,那麼實際上Geoff的FQL調用提供了太多的信息,然後您需要。

我還注意到,Geoff的FQL返回了這麼多的數據,Facebook實際上截斷了數據。

此外,你可能希望得到的那些朋友的名字在同一FQL電話...

另一種FQL看起來更好的是這樣的:

SELECT name,mutual_friend_count FROM user WHERE uid IN(
SELECT uid2 FROM friend WHERE uid1=me()) 

這將返回的數量你朋友列表中的共同朋友。所以如果你有500個朋友,你只會得到500個對象的迴應。