0

我需要一种方法来排序行列表并将用户的 Facebook 朋友放在首位。

有什么办法可以做到吗?我应该遵循哪种方法?

我从未使用过 Facebook Connect,所以这只是一个假设性问题,因为我很快就会使用它。

我是否应该在每次用户搜索时都获取 Facebook 好友列表(并将生成列表)。然后在我的表中,我会保存每个用户的 facebook_uid?

但是我将如何订购它,以便 Facebook 朋友优先,然后显示“陌生人”?

例如,我的表可能如下所示:

id - facebook_uid - text
1  - 1111111      - lorem ipsum.....
2  - 2222222      - something else....
3  - 3333333      - third!!!

因此,如果例如 1111111 和 3333333 是我的朋友,则返回的 ID 将是(按正确的顺序):1,3,2。

如何在 SQL(或 PHP 逻辑)中排序?

4

3 回答 3

1

我按照 Robin 的方法使用了两个数组。

首先,我从 Graph 加载 Facebook 好友列表 (json)。然后我遍历它,创建一个只有朋友 ID 的数组。这样,我可以只使用 in_array 来检查特定 ID 是否是朋友。

<?php
function get_facebook_friends(){
    $friends = json_decode(file_get_contents("https://graph.facebook.com/me/friends?access_token=XXXXXX"));
    $friendArray = array();

    foreach($friends->data as $friend){
        $friendArray[] = $friend->id;
    }

    return $friendArray;
}

function is_facebook_friend($friends, $facebook_uid){   
    return in_array($facebook_uid, $friends);
}

//Do your query stuff...

$friends = get_facebook_friends();
$is_friends = array();
$not_friends = array();

foreach ($rows as $row){
    if(is_facebook_friend($friends, $row->facebook_uid)){ //Is friend
        $is_friends[] = $row;
    }else{
        $not_friends[] = $row;          
    }
}

$rows = array_merge($is_friends, $not_friends);

//Do normal loop here
?>

它非常高效和快速。

于 2012-10-23T12:32:50.330 回答
0

Facebook 图表可以使用fql。虽然它是基于 SQL 的,但它有一些限制,例如缺失NOT IN()和东西。facebook_id通过在 table 中运行所有 take的 s friend,您可以通过查询确定他们是否是朋友。

这假设您存储了他们的所有 ID。假设您搜索并获得 10 个结果。friend通过-table运行所有这些 id,例如:

SELECT uid2 FROM friend WHERE uid1 = me() AND uid2 IN ({$search_user_1}, {$search_user_1}, ...)

返回的uid2显然是给定人的朋友。

更新:

UNION我怀疑fql 可以subqueries根据需要处理。但我的解决方案仍然相同。

提取行,通过 Facebook 的 api 运行 fql 并比较匹配项。如果它们匹配,您可以将它们放入数组$friends中,否则$not_friends然后$users = array_merge($friends, $not_friends)它们会被排序。动用你的想象力。

这个,或者首先运行一个 fql 来获取当前用户的朋友,然后将它们添加到您自己的数据库中的另一个表中,每个访问日/小时/页面。然后只需运行 aJOIN来检查他们是否是朋友。

于 2012-10-23T10:12:42.090 回答
0

因此,如果例如 1111111 和 3333333 是我的朋友,则返回的 ID 将是(按正确的顺序):1,3,2。

如何在 SQL(或 PHP 逻辑)中排序?

我会说这应该足够了(在 MySQL 中):

… ORDER BY IF(facebook_uid IN (1111111,3333333), 1, 0) DESC

如果记录的 facebook_uid 在给定列表中,这将导致“排序值”为 1,否则为 0。对它进行 DESCending 排序会使 1 值排在 0 值之前。

将逗号分隔的朋友 ID 的实际列表插入 IN 运算符的括号应该没什么大不了的,例如,如果您将它们作为一个数组,您可以使用逗号作为分隔符将它们内爆。

于 2012-10-23T11:25:56.587 回答