2011-12-04 24 views
3

私は彼らと共有している友人を最高の数の相互の友人にしたいと思っています。最高の友人数の友達

  1. は、現在ログインしているユーザーのフレンドリストを取得します:
    私はFQLとグラフAPIで次のようにそれを実行しようとしました。
    FQL:SELECT uid1 FROM friend WHERE uid2="MY_USER_ID" and uid1 IN (SELECT uid1 FROM friend WHERE uid2=me())
    グラフAPI:リスト内のUIDの一人一人のために$facebook->api('/me/friends?format=json&limit=5000')

  2. 、私は、共通の友人のリストを取得し、それを数えることができます。
    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

私はまさにあなたが最終的に達成したいとは思っていません。しかし、あなたがトップの友人を探している場合は、フィードを取得してそれを達成することができ、投稿の数に応じて友達をランク付けすることができます。

$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:戻ってくる配列は、 'rate'値ではなく、ユーザーIDでソートされます。 もう1つのことは、私の現在の友人に限定されず、私を夢中にしたユーザーがリストに入っていることを意味します。 –

+0

「レート」でソートすると、次のようになります。 http://www.firsttube.com/read/sorting-a-multi-dimensional-array-with-php/ しかし、私はまだ2番目の問題を解決する必要があります。 –

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

Geoffの提案はおそらくFQLでできるだけ遠くまであなたを得るでしょう。このクエリの結果が得られたら、相互接続数が最も多い友人を見つけることはかなり簡単です。結果に最も頻繁に現れるuidを見つけてください。これがあなたの答えです。 –

+0

Geoff、あなたが提案したクエリは、uidのペアを持つJSONオブジェクトを返します。等:{ "UID1": "22069X"、 "UID2": "71286421X" }、{ "UID1": "22091X"、 "UID2": "22498X" } @Zachary - Iドン私の友人のうちの一人が最も高い数の相互友好を共有しているその情報からどのように抽出することができますか? –

+0

[私の新しい回答](http://stackoverflow.com/a/8828048/988990)を参照してください。 –

4

次のステップへの答えを見ると、ここではPHPの完全なソリューションです。

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を取得し、あなたと最も共通の友人を持っている友人をチェックすることです:

まず、ここでジェフのFQLでした。 (あなたがURLにあなたのアクセストークンを置き換えることを確認してください。)

<?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個のオブジェクトでしか応答しません。

関連する問題