从多个数组php中找到最低值

时间:2013-11-20 23:51:13

标签: php arrays

我正在开发一个基于数字的游戏,以计算多个阵列中的组合最低数字。

示例:

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

如何进行计算?

解释我如何处理这种情况:参考:图片下方。 enter image description here

不是这样,还有更多210个人输入。

Similar application

4 个答案:

答案 0 :(得分:4)

您真的应该阅读有关数据库规范化的内容,然后如果您规范化数据库,那么每个用户存储5或100个分数并不重要。请查看下表模式:

  • 用户
    • ID
    • 名称
  • 分数
    • ID
    • USER_ID
    • score_nr

要从这些表中获取示例结果,您必须使用以下查询:

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;

Working example

答案 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);