我正在开发一个基于数字的游戏,以计算多个阵列中的组合最低数字。
示例:
$arr1 = array('score_1'=>0,'score_2'=>5,'score_3'=>0,'score_4'=>2,'score_5'=>1);
$arr2 = array('score_1'=>3,'score_2'=>0,'score_3'=>2,'score_4'=>0,'score_5'=>0);
$arr3 = array('score_1'=>0,'score_2'=>0,'score_3'=>0,'score_4'=>4,'score_5'=>0);
上面的示例结果将是:
score_1 = 0+3+0 = 3
score_2 = 5+0+0 = 5
score_3 = 0+2+0 = 2
score_4 = 2+0+4 = 6
score_5 = 1+0+0 = 1 /*This is the winning number*/
每个数组都是来自每个用户的提交,存储在单个数据库字段中(而不是在单独的字段中,例如.. score_1,score_e等...)
我没有使用单独的表格字段,因为游戏后来需要180个得分字段。为了优化数据库,我为每个分数使用数组而不是表字段。
我正在存储每一行:
score_1:0,score_2:0 etc...
后来我循环遍历每一行,如:
$main_score[main_score] = $array_score[score_$key]=$value;
每行的最终结果:
$arr1 = array('score_1'=>0,'score_2'=>5,'score_3'=>0,'score_4'=>2,'score_5'=>1);
如何进行计算?
解释我如何处理这种情况:参考:图片下方。
不是这样,还有更多210个人输入。
答案 0 :(得分:4)
您真的应该阅读有关数据库规范化的内容,然后如果您规范化数据库,那么每个用户存储5或100个分数并不重要。请查看下表模式:
要从这些表中获取示例结果,您必须使用以下查询:
SELECT `score_nr`, SUM(`value`) AS `value_sum`
FROM `scores` GROUP BY `score_nr`
要获取具有最小总和的score_nr
:
SELECT `score_nr`, SUM(`value`) AS `value_sum`
FROM `scores` GROUP BY `score_nr` ORDER BY `value_sum` ASC LIMIT 1
答案 1 :(得分:2)
同时循环遍历数组并计算它们的总和。跟踪最小的键和值:
$smallest_val = PHP_INT_MAX;
$smallest_key = '';
foreach($arr1 as $key => $val) {
echo $key ." = ". $val ."+". $arr2[$key] ."+". $arr3[$key] ."<br />";
$sum = $val + $arr2[$key] + $arr3[$key];
if($sum < $smallest_val) {
$smallest_val = $sum;
$smallest_key = $key;
}
}
echo "Winrar: ". $smallest_key . " with value " . $smallest_val;
答案 2 :(得分:1)
我认为您可以在数据库上创建一个新表来进行评分。
例如,您有primary key by game_id
表:得分
------------------------------------
|id|game_id | score_no| arr | score |
------------------------------------
|1 | 0 | score_1 | 1 | 0 |
|2 | 0 | score_2 | 1 | 5 |
|3 | 0 | score_3 | 1 | 0 |
|4 | 0 | score_4 | 1 | 2 |
|5 | 0 | score_5 | 1 | 1 |
|6 | 0 | score_1 | 2 | 0 |
|7 | 0 | score_2 | 2 | 5 |
|8 | 0 | score_3 | 2 | 0 |
|9 | 0 | score_4 | 2 | 2 |
|10| 0 | score_5 | 2 | 1 |
|11| 0 | score_1 | 3 | 0 |
|12| 0 | score_2 | 3 | 5 |
|13| 0 | score_3 | 3 | 0 |
|14| 0 | score_4 | 3 | 2 |
|15| 0 | score_5 | 3 | 1 |
------------------------------------
您可以使用查询
进行选择SELECT score_no, SUM(`score`) AS `sum_score` FROM `scores` GROUP BY game_id, score_no
答案 3 :(得分:0)
如果您想坚持使用当前架构,那么代码量最少的解决方案应该如下:
$summedScores = array_map('array_sum', array_merge_recursive($arr1, $arr2, $arr3));
asort($summedScores, SORT_NUMERIC);
reset($summedScores);
$winnerScoreNr = key($summedScores);