2011-12-19 70 views
0

在我的一个在PHP应用程序中有一个比赛部分。它包含多个选项10个问题,每个都有4个选项。PHP大赛逻辑

用户填写我保存的答案作为DB逗号分隔值表格后。像如下:

user | answer 
------------------------------------- 
112 | 1,7,8,9,8,5,2,3,6,7,9,6 

我得到了接听键一样使用的填充接听键..

什么是评估用户的输入,并找出得分最高的用户的最佳方法的逻辑?

+0

最好的办法是不存储数据的方式... – ceejayoz 2011-12-19 21:36:16

+4

逗号分隔值......在数据库中?请不要在自己的脚下开枪......使用多个链接表(根据[关系数据库模型](http://en.wikipedia.org/wiki/Relational_database))。 – qJake 2011-12-19 21:38:14

+1

+1 SpikeX。在单个列中存储这样的多个值甚至不是1NF。如果你想改变问题的数量,你最终会面临许多令人头痛的问题。 – 2011-12-19 21:39:30

回答

1

正如评论所说,这不是存储数据的最佳方式,但我评价是这样的:

$query = mysql_query("select * from `table` where 1",CONNECTION_IDENTIFIER) or die("die message"); 
$answer_key = array(answer1,answer2,etc); 
$high_score = 0; 
$high_scorer= ""; 
while($r=mysql_fetch_array($query)){ 
    $users_answers = explode(',',$r['answer']); 
    $user_score = 0; 
    for($i=0;$i<10;$i++){ 
     if ($answer_key[$i]==$users_answers[$i]){ 
      $user_score++; 
     } 
    } 
    if ($user_score > $high_score){ 
      $high_score = $user_score; 
      $high_scorer = $r['user']; 
    } 
} 

echo "High scorer is $high_scorer with $high_score points"; 
+0

感谢您的回复,这似乎是我正在寻找...谢谢..我会通过它。 。顺便说一句如何增加这个功能的执行时间..在越来越多的答案的情况下? – ramesh 2011-12-19 22:00:27

+1

该解决方案应该适用于多达数千用户。如果你期望的不仅仅是你想要采取不同的方法......但老实说,给定比你只有10,000个可能的组合(10^4),你不会有几个人参加测试的机会一旦你有50K +的受访者是非常小的......也许在上面添加一些代码来检查是否有人已经把它(比较答案关键字字符串和用户键字符串...很可能有一些人会匹配,一旦你有很多的受访者)...如果有匹配,则跳过循环 – 2011-12-19 22:17:31

+0

另外,如果这不起作用,您还可以在答案表中添加一列,并在添加答案时存储用户的分数(一旦它们提交了答案,它就会运行比较函数并存储他们的条目,如: 用户:1322,答案:1,4,7,2,5,1,5,5,2,8,得分:8 然后使用mysql的“ORDER BY”或MAX()函数来获得最好的分数......这将允许您在整个调查过程中处理分数,而不是一次性处理分数。 – 2011-12-19 22:20:39

1

如果你有得分这样的答案:

$ answersRating = array(1 => 0,2 => 1,3 => 3,4 => 2,...)选择答案1时,他得到0分,2 => 1分,3 => 3点等。你可以做这样的事情:

$score = array_sum(array_intersect_key($answersRating, array_flip(explode(',', $userAnswersStringFromDB)))); 
1

我想你应该构建您的数据库是这样的: 注意:这是最低限度的,你当然会增加额外的字段,如姓名,说明的问题等

answers | id, user_id, question_id, answer 
questions | id, contest_id, correct_answer 
user  | id, name 

然后你可以得到一切与查询。

最高分:

SELECT u.name,count(*) as Score FROM user u, answers a, questions q WHERE u.id=a.user_id and q.id = a.question_id and q.correct_answer=a.answer WHERE q.contest_id=XXX ORDER BY Score 
+0

嗨,感谢您的回复,并且......我怀疑......你意思是答案表中的答案行是逗号分隔的值,如(1,4,2,4,1,3,4)。请帮忙 – ramesh 2012-01-06 05:43:18