0

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

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

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

这是有问题的代码:

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

3 回答 3

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.userIdf.following,但users结构仍然未知)。

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

编辑:详细说明一下,让 RDBMS 为您完成关系、聚合和排序工作。这就是它的工作,它在这方面表现良好。

于 2013-10-05T18:52:24.817 回答
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
于 2013-10-05T19:02:33.310 回答
0

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

于 2013-10-05T18:52:09.393 回答