我试图做一个基于点系统订购用户的PHP脚本。问题是在执行用户后计算得分。像这样:
$getScore = $db->prepare("SELECT * FROM `users`");
$getScore->execute();
$results = $getScore->fetchAll();
foreach($results as $row):
$likes = $get->likes("user", $row["id"]);
$subscribers = $get->subscribers("user", $row["id"]);
$score = $get->score($likes, $subscribers, $row["date"]);
echo $row["username"];
endforeach;
如果没有其他执行,我该如何订购结果?我希望首先显示$score
上具有最高价值的用户。我已经尝试了很多东西,但没有连续。
提前致谢!
答案 0 :(得分:1)
您可以采用这种不同的方式。
如果您已经从数据库加载了所有数据,则可以使用PHP对它们进行排序。 可以使用usort完成自定义排序。
也许你可以使用这样的东西:
$users = array();
// Load all the users and calculate scores
foreach($results as $row):
$users[$row["username"]] = $get->score($likes, $subscribers, $row["date"]);
endforeach;
// Sort users based on score
sort($users);
// Output users, sorted by score
foreach($score as $key => $row):
echo $key, " score:", $score;
endforeach;
如果您想使用更复杂的数据结构,您所要做的就是实施特殊比较,以确保按分数排序。
如果将点存储在数据库中,则可以使用包含ORDER BY子句的特殊查询,这样就可以返回已订购的用户。
我认为使用DBMS对用户进行排序会产生更具伸缩性的解决方案。如果您的用户数量非常多,那么对每个页面加载的所有用户进行排序都不会很好。
答案 1 :(得分:1)
首先,抱歉建议另一个执行流程。接下来,这是我的解决方案:
$getScore = $db->prepare("SELECT * FROM `users`;");
$getScore->execute();
$results = $getScore->fetchAll();
// Result is something like [rownum][colomname]
array_walk_recursive($results, function($item, $key) {
$id = $item["id"];
$date = $item["date"];
$arr = array();
$arr['likes'] = $get->likes("user", $id);
$arr['subscribers'] = $get->subscribers("user", $id);
$arr["score"] = $get->score($arr["likes"],
$arr["subscribers"],
$date);
$item = array_merge($item, $arr);
});
在此代码中,您可以从数据库中获取结果。接下来,您计算分数之类的内容,然后将其添加到数组中。
要在乐谱上对此数组进行排序,您可以使用PHP多重排序功能(http://php.net/manual/en/function.array-multisort.php):
foreach ($results as $key => $row) {
$score[$key] = $row["score"];
}
array_multisort($score, SORT_DESC, $results);
当您循环循环以打印数据时,您可以这样做:
foreach($results as $row) {
$likes = $row["likes"];
$subscribers = $row["subscribers"];
$score = $row["score"];
echo("your stuff over here");
}
祝你好运!