Друг с наибольшим количеством общих друзей - PullRequest
3 голосов
/ 04 декабря 2011

Я хочу найти моего друга, которым я поделился с ними наибольшим количеством общих друзей.
Я попытался сделать это с FQL и графическим API следующим образом:

  1. Получить список друзей текущего вошедшего в систему пользователя.
    FQL: SELECT uid1 FROM friend WHERE uid2="MY_USER_ID" and uid1 IN (SELECT uid1 FROM friend WHERE uid2=me())
    Graph API: $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')

ОДНАКО , это ТОНН времени уходит на то, чтобы пройти через всех моих друзей ...
Вам знаком лучший способ сделать это?

Ответы [ 4 ]

9 голосов
/ 03 марта 2012

Если ваша цель состоит только в том, чтобы получить список друзей с наибольшим количеством общих друзей, т. Е. Вас не волнует, кто эти общие друзья, то на самом деле 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 объектами.

4 голосов
/ 12 января 2012

В ответе Джеффа на следующий шаг приведено полное решение в 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 и выясни, у какого друга больше общих друзей с тобой.(Убедитесь, что вы заменили свой токен доступа в 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."

?>
3 голосов
/ 04 декабря 2011

Я использовал такой запрос, чтобы найти общих друзей:

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 голосов
/ 04 декабря 2011

Я не уверен, что именно вы хотите достичь в конце концов.Но если вы ищете лучших друзей в списке, вы можете добиться этого, выбирая фид, а затем можете ранжировать друзей по количеству сообщений.

$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);
}
...