【问题标题】:How to loop through multidimensional arrays and perform queries accordingly?如何遍历多维数组并相应地执行查询?
【发布时间】:2012-04-07 22:05:57
【问题描述】:

好吧,已经很晚了,所以我想我只是筋疲力尽了,但我已经尝试解决这个问题大约一个小时了,但我找不到适合我的解决方案。基本上,代码会查询数据库以找出游戏中有多少人,然后进行一些数学运算来比较人与人之间的分数。之后,它会填充一个数组,其中包含玩家及其分数唯一的 id。现在的问题是,我正在尝试将包含人员列表及其分数的数组与包含玩家将根据他们的等级获得的分数的数组进行比较。我似乎不知道如何将两个数组拉在一起并相应地分配点。代码如下:

$game_id = 4; //will be replaced later on, just for testing
$x = 0;
$y = 0;
$point_array = array();

$entrantsquery = mysql_query("SELECT * FROM game_entrants WHERE game_id='$game_id' AND discipline=1");

while($entrantsarray = mysql_fetch_array($entrantsquery , MYSQL_ASSOC)){
    $statquery = mysql_query("SELECT * FROM player_stats WHERE player_id={$entrantsarray['player_id']}");
    $statarray = mysql_fetch_array($statquery, MYSQL_ASSOC);
    $points = $statarray['stat1'] + $statarray['stat2'] + ($statarray['stat3']*2.3) + $statarray['stat4'] + ($statarray['stat5']*2.7);
    $point_array[$x][$y] = $entrantsarray['player_id'];
    $y++;
    $point_array[$x][$y] = $points;
    $x++;
    $y--;
    }

任何帮助都将不胜感激,因为这已经开始让我头疼了。

编辑:

下面是包含另一个数组的代码:

$total_points = 5000;
$distribution_quantity = 25;
$M = $distribution_quantity-1;
$K = ($distribution_quantity * $M) / 2;
$difference = 15;
$award_points = array();

$equation = ($total_points - ($K * $difference))/$distribution_quantity;

for ($z = $distribution_quantity; $z > 0; $z--) {
$award_points[] = $equation = $equation+$difference;
}

foreach ($award_points as $value) {
    echo $value. "<br>";

}

最新更新:

我认为你误会了我。

我有两个数组。第一个数组由用户的唯一 ID 列表和匹配点组成。比赛中得分最多的球员是#1。现在我的第二个数组包含由 25 个数字组成的列表的数据。每个数字代表比赛中的排名。 1 代表最好的球员,25 代表最差的球员。每个等级都有一组不同的积分,这些积分将被添加到玩家的总积分中。第一个数组中的分数仅用于确定玩家在比赛中的整体排名。

例如。

玩家 1 在一场比赛中获得 240 分。 玩家 2 获得 180 分。 玩家 3 得到 210。 以此类推。

这意味着玩家 1 获得了第一名。玩家 3 获得第二名。玩家 2 获得第三名。

现在假设第二个数组如下所示:

1 -> 500 2 -> 300 3 -> 100

玩家 1 获得 500 分。 玩家 2 获得 100 分。 玩家 3 获得 300 分。

我希望这能让它更清楚一点。

【问题讨论】:

  • 那么这里的主要问题是什么?什么线?
  • 我只需要帮助获取$point_array,它基本上保存了玩家列表和他们的统计数据积累,并将其与$award_points进行比较。有 25 名球员,他们的排名各不相同,1 是最好的,25 是最差的。 $award_points 数组包含 25 个数字的列表。我需要奖励来自 $point_array 的玩家,无论他们获得的排名有多少积分,这些数字都保存在 $award_points

标签: php mysql


【解决方案1】:

会有所帮助,但有很多事情

  1. 对 mysql_query 和 mysql_fetch_array 使用两次 $statquery 是个坏主意

  2. 以下代码对我没有意义(其他人不确定)

    $point_array[$x][$y] = $entrantsarray['player_id'];
    $y++;
    $point_array[$x][$y] = $points;
    
  3. 您的第一个代码中的 $award_points 在哪里支付...

有了更多信息..我可以用更改进的代码更新这个答案

==========================更新===================== ==

请确认你说的是不是这个

    $users = array();
    $users[] = array("id"=>1,"points"=>267);
    $users[] = array("id"=>2,"points"=>265);
    $users[] = array("id"=>3,"points"=>245);

    $ranks = array();
    $ranks[] = array("rank"=>1,"points"=>345);
    $ranks[] = array("rank"=>2,"points"=>267);
    $ranks[] = array("rank"=>3,"points"=>265);

    $final = array();
    foreach($users as $key => $user)
    {
        $user['rank'] = 0 ; // Not rancked Yet
        foreach ($ranks as $rKey => $rank)
        {    
            //var_dump($rank);
            if($user['points'] >= $rank['points'])
            {
                $user['rank'] = $rank['rank'] ;
            }
        }

        $final[$key] = $user ;
    }

    var_dump($users,$final);

输出

    // Users Before 
    array
      0 => 
        array
          'id' => int 1
          'points' => int 267
      1 => 
        array
          'id' => int 2
          'points' => int 265
      2 => 
        array
          'id' => int 3
          'points' => int 245


     // Users After        
    array
      0 => 
        array
          'id' => int 1
          'points' => int 267
          'rank' => int 3
      1 => 
        array
          'id' => int 2
          'points' => int 265
          'rank' => int 3
      2 => 
        array
          'id' => int 3
          'points' => int 245
          'rank' => int 0

谢谢 :)

【讨论】:

  • 1.我没用过两次? 2. 它用球员和他们的分数填充第一个数组。 3. 问题是让第二个数组与第一个数组交互。
【解决方案2】:

我要做的是对当前点数组进行排序,使其按等级排序,然后循环遍历每个数组,将新点添加到当前点。请参阅此处了解如何sort a multi-dimensional array

所以

$currentPoints = /* sort current points array */
foreach( $rankingPoints as $rank => $extraPoints ) {
  // probably add some sanity checking here to make sure this rank exists in the $currentPoints array
  $currentPoints[$rank]['points']+= $extraPoints;
}

$currentPoints 现在应该包含更新后的总积分。

通过一些工作,您可能可以使每个数组成为一个简单的一维数组,这将使排序等更容易。

【讨论】:

    【解决方案3】:

    我认为改变 $award_points 的结构可能会有所帮助,例如分数是关键,排名是价值。

    array {
       345 => 1,
       267 => 2,
       265 => 3,
       .
       .   
    }
    

    现在,您可以简单地遍历 $point_array 并从 $award_points 中获取相应的排名。

    foreach ($point_array as $key => $arr) {
        $point_array[$key]['rank'] = $award_points[$arr['points']]
    }
    print_r($point_array);
    

    我还没有测试过代码,但我认为它应该可以工作。

    根据问题的最新更新进行编辑

    首先,让我们修改用于填充 $point_array 的代码,如下所示:

    $game_id = 4; //will be replaced later on, just for testing
    $point_array = array();
    
    $entrantsquery = mysql_query("SELECT * FROM game_entrants WHERE game_id='$game_id' AND discipline=1");
    while($entrantsarray = mysql_fetch_array($entrantsquery , MYSQL_ASSOC)){
        $statquery = mysql_query("SELECT * FROM player_stats WHERE player_id={$entrantsarray['player_id']}");
        $statarray = mysql_fetch_array($statquery, MYSQL_ASSOC);
        $points = $statarray['stat1'] + $statarray['stat2'] + ($statarray['stat3']*2.3) + $statarray['stat4'] + ($statarray['stat5']*2.7);
        $point_array[$entrantsarray['player_id']] = $points;
    }
    arsort($point_array);
    

    注意最后的 arsort() 方法。这将为 $point_array 提供以下结构(基于您最新更新中的示例)并按其点的降序排列:

    $point_array = Array (
            1 => 240,
            3 => 210,
            2 => 180
        )
    

    现在,假设 $award_points 具有以下结构:

    $award_points = Array (
            1 => 500,
            2 => 300,
            3 => 100
        )
    

    下面的代码现在应该为您提供所需的结果集,即根据达到的排名将奖励积分添加到玩家获得的分数中

    $prev_player_point = 0;
    $read_rank = 0;
    foreach ($point_array as $player_id => $player_point) {
        if ($player_point != $prev_player_point) {
            ++$read_rank;
        }
        $new_point_array[$player_id] = $player_point + $award_points[$read_rank];
        $prev_player_point = $player_point;
    }
    print_r($new_point_array);
    

    我希望我理解您的需求,并且以上内容是有道理的。

    【讨论】:

    • 非常感谢,一开始没看懂,很抱歉。
    • 没问题@NickSavage,也许我无法很好地理解它。很好,它现在工作了:-)
    猜你喜欢
    • 2013-03-25
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 2014-10-03
    • 2012-04-16
    相关资源
    最近更新 更多