根据关注者数量创建前10名用户数组?

时间:2013-10-05 18:36:10

标签: php algorithm

我没有太多使用PHP的经验,但我已经开发了一个粗略的算法来确定社交网络上的前10名用户的关注者数量。它确实返回了一个似乎正确的用户列表,但我可以看到有两个问题:

  1. 这似乎是非常重复和资源密集型的,特别是如果我们有很多用户。如果用户没有比最后一个位置更多的关注者,同时仍然保持排序顺序,是否有一种简单的方法可以使算法短路?如何压缩/简化算法?

  2. 它并不完全有效。它返回的用户列表不是前10位用户。例如,运行脚本现在返回具有这些跟随者计数的用户(按顺序):54,7,6,4,1,3,2,2,1,1。这些数字似乎是正确的,但我知道一个事实至少有两个其他用户的关注者数量高于54.此外,第五个用户不合适。这是我们的算法的问题还是其他问题(也许我们如何存储关注者)?

  3. 以下是相关代码:

    $array = array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    
    $result = mysql_query("SELECT * FROM users") or die(mysql_error());;
    for($i = 0; $user = mysql_fetch_array($result, MYSQL_NUM); $i++) {
        if      (following($user[0]) > following($array[0])) $array[0] = $user[0];
        else if (following($user[0]) > following($array[1])) $array[1] = $user[0];
        else if (following($user[0]) > following($array[2])) $array[2] = $user[0];
        else if (following($user[0]) > following($array[3])) $array[3] = $user[0];
        else if (following($user[0]) > following($array[4])) $array[4] = $user[0];
        else if (following($user[0]) > following($array[5])) $array[5] = $user[0];
        else if (following($user[0]) > following($array[6])) $array[6] = $user[0];
        else if (following($user[0]) > following($array[7])) $array[7] = $user[0];
        else if (following($user[0]) > following($array[8])) $array[8] = $user[0];
        else if (following($user[0]) > following($array[9])) $array[9] = $user[0];
    }
    

    在此之后,它将数组输入到MySQL表中。提前谢谢。

    编辑:这是关注者功能的代码。

            function followers($id){
            $query = mysql_query("SELECT * FROM follow WHERE following='$id' AND follower!='$id'");
            return mysql_num_rows($query);
            }
    

3 个答案:

答案 0 :(得分:1)

不要只是SELECT * FROM users。尝试

select u.userId,count(*) as n
from users u,followers f
where u.userId=f.following
group by u.userId
order by count(*) desc
limit 10

字段名称是虚构的,因为我不知道您的实际表格结构(编辑:刚刚将f.userId更改为f.following,但是users结构仍然未知)。

这将为您提供您想要的前10个组,并使用PHP进行迭代变得更容易。

编辑:为了详细说明,让RDBMS为您完成关系,聚合和排序工作。这是它的工作,并且表现良好。

答案 1 :(得分:1)

以下是两种可能的解决方案。取决于你的表结构。在这种情况下,我不会用PHP排序。使用SQL简单快捷。

如果关注者存储在用户表中:

SELECT *                // try to avoid *
  FROM `users`
 ORDER BY followers DESC
 LIMIT 10

如果关注者存储在另一个表格中(编辑:适应您的结构:):

SELECT u.user_id, COUNT(*) AS num_followers
  FROM `users` u, `follow` f
 WHERE u.user_id = f.following
 GROUP BY u.user_id
 ORDER BY COUNT(*) DESC
 LIMIT 10

答案 2 :(得分:0)

有很多用于排序的php函数,你不必自己编写。 http://php.net/manual/de/array.sorting.php