代码之家  ›  专栏  ›  技术社区  ›  typeoneerror

如何订购从新Facebook图形API返回的朋友列表?

  •  9
  • typeoneerror  · 技术社区  · 15 年前

    您可以通过以下方式获取已验证用户的朋友列表:

    https://graph.facebook.com/me/friends

    有人知道如何按用户名排序列表吗?因为默认情况下不会。文档中没有任何内容。

    9 回复  |  直到 11 年前
        1
  •  12
  •   sakibmoon    11 年前

    我们在几个应用程序中通过在javascript中排序来实现这一点。

    function sortByName(a, b) {
        var x = a.name.toLowerCase();
        var y = b.name.toLowerCase();
        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
    }
    
    var _friend_data = null
    function lazy_load_friend_data(uid) {
      if (_friend_data == null) {    
        FB.api('/me/friends', function(response) {        
            _friend_data = response.data.sort(sortByName);
          }
        )
      }
    }
    
        2
  •  5
  •   sakibmoon    11 年前

    找到了解决方案。最终,我们可能能够对图形结果进行排序。现在,我只是在做这个(javascript)。假设我的php会话中有“fb-uid”:

    var friends = FB.Data.query("SELECT name, uid FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1={0}) ORDER BY name", parseInt(fb_uid));
    friends.wait(function(rows){
        console.log(rows);
    });
    
        3
  •  3
  •   sakibmoon    11 年前

    我认为整个OpengraphAPI仍处于FBConnect的过渡阶段。在任何情况下,我只需要在FQL中按查询执行一个好的旧订单,您仍然可以使用它。我无法想象,一旦这样做的开放图形方式建立起来,要改变它将是多么困难。

    这个非常好的教程向您展示了如何做到这一点:

    http://thinkdiff.net/facebook/php-sdk-graph-api-base-facebook-connect-tutorial/

    $fql    =   "select name, hometown_location, sex, pic_square from user where uid=xxxxxxxxxxxxxxx";
    $param  =   array(
            'method'     => 'fql.query',
            'query'      => $fql,
            'callback'   => ''
    );
    $fqlResult   =   $facebook->api($param);
    
        4
  •  2
  •   vodkhang    15 年前

    如果你是在打电话的那一方,有什么问题?这意味着,从该图形API中获得所有朋友后,您可以将所有朋友放入已排序的数据结构中,然后显示所有朋友:)

        5
  •  2
  •   dyltini    11 年前

    在一个调用中使用FQL。

    SELECT uid, name FROM user WHERE uid IN 
    (SELECT uid2 FROM friend WHERE uid1 = me()) 
    ORDER BY name ASC
    
        6
  •  1
  •   Akeem    14 年前

    对我来说,一个简单的助手($friends);工作得很好;)

        7
  •  1
  •   sakibmoon    11 年前
    $friends = $facebook->api('me/friends');
    foreach ($friends as $key=>$value) {
        sort($value);
        foreach ($value as $fkey=>$fvalue) {
          echo "<img src='https://graph.facebook.com/".$fvalue[id]."/picture' width='50' height='50' title='".$fvalue[name]."' />";     
        }
    }
    
        8
  •  0
  •   sakibmoon    11 年前

    以@mainsocial的答案为基础,但只按姓氏而不是名字排序:

    function sortByName(a, b) {
        var fn = function(x) { return x.name.toLowerCase(); };
        var ln = function(x) { return x.last_name.toLowerCase(); };
        if(ln(a) == ln(b)){
            if(fn(a) == fn(b)) {
                return 0;
            }
            return (fn(a) < fn(b)) ? -1 : 1;
        }
        return (ln(a) < ln(b)) ? -1 : 1;
    }
    
    function getFriendsList() {
        FB.api('/me/friends', {fields: 'name,id,last_name'}, function(response) {
            var friends = response.data.sort(sortByName);
            for (i=0; i<friends.length; i++) {
                $('body').append(friends[i].name + ' - ' + friends[i].id + '<br>');
            }
        });
    }
    
    getFriendsList()
    
        9
  •  0
  •   sakibmoon    11 年前
    private function _compareFacebookFriends($a, $b)
    {
        return strcasecmp($a['name'], $b['name']);
    }
    
    public function sortFacebookFriendsArray(&$array)
    {
        usort($array, '_compareFacebookFriends');
    }
    
    /* Add here $facebook's initialization. Use Facebook PHP SDK */
    $fbFriends = $facebook->api('/me/friends');
    sortFacebookFriendsArray($fbFriends);