我的数据库存储有关用户、他们的组和关系的信息。users 表中的一列 ,fcount
跟踪每个用户在其当前组中的关系数;它从 0 开始,我会在适当的时候增加它。
我需要编写一个脚本来选择给定组中的所有用户,然后随机选择其中一个用户,被选中的概率取决于一个人拥有的关系数量;更少的关系意味着更大的可能性。
目前,我使用以下代码完成此操作,减去概率部分:
$query = "SELECT uid FROM users WHERE groupid=:gid AND status='1'";
...
while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
$friends[] = $row[0];
}
foreach ($users as $value) {
$key = array_search($value, $friends);
unset($friends[$key]);
shuffle($friends);
$newrel = end($friends);
$user = $value;
$friends[] = $value;
$query = "UPDATE users SET rel=:newrel WHERE uid=:uid";
$query_params = array(':newrel' => $newrel, ':uid' => $user );
... }
我认为调整概率的最简单方法是编辑$friends
数组,以便用户多次出现。因此,具有fcount
0 的用户将在数组中重复 5 次,具有fcount
1 的用户将重复 3 次。[也许这不是处理它的最佳方式,但它对我来说很有意义并且符合我已有的代码。您可以自由提供更好的方案。]
我还没有弄清楚如何获取用户数组并将应该相乘的用户的条目相乘。
SELECT uid, fcount FROM users WHERE groupid=:gid AND status='1';
返回反映此表的数组:
+-----+--------+
| uid | fcount |
+-----+--------+
| 105 | 3 |
| 106 | 2 |
| 107 | 0 |
| 108 | 0 |
| 109 | 1 |
+-----+--------+
然后变成这样的数组:
array(15) {
[0]=> string(3) "105"
[1]=> string(3) "106"
[2]=> string(3) "107"
[3]=> string(3) "107"
[4]=> string(3) "107"
[5]=> string(3) "107"
[6]=> string(3) "107"
[7]=> string(3) "108"
[8]=> string(3) "108"
[9]=> string(3) "108"
[10]=> string(3) "108"
[11]=> string(3) "108"
[12]=> string(3) "109"
[13]=> string(3) "109"
[14]=> string(3) "109"
}
在我看来,这可以通过根据循环中的 if 语句foreach
将每个用户 ID n次推送到新数组中来完成。我会尝试构建它,即使我可能会失败。