如何循环遍历多维数组并相应地执行查询?

时间:2012-03-23 10:30:04

标签: php mysql

嗯,现在已经很晚了,所以我觉得我已经筋疲力尽了但是我一直在尝试解决这个问题大约一个小时,我找不到适合我的解决方案。基本上,代码查询数据库以找出游戏中有多少人,然后它会进行一些数学计算以比较人与人之间的点数。之后,它会填充一个数组,其中包含玩家及其分数所特有的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 - &gt; 500 2 - &gt; 300 3 - &gt; 100

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

我希望这会让它更加清晰。

3 个答案:

答案 0 :(得分:1)

我认为改变$ 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);

我希望我了解你的需要,而且上述内容是有道理的。

答案 1 :(得分:0)

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

  1. 两次使用$ statquery for mysql_query&amp; mysql_fetch_array是个坏主意

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

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

  4. 了解更多信息..我可以使用更加改进的代码更新此答案

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

    请确认这是否是您所说的

        $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
    

    由于 :)

答案 2 :(得分:0)

我要做的是对您的当前点数组进行排序,使其按顺序排序,然后遍历每个数组,将新点添加到当前点。请参阅此处了解如何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现在应该包含更新的总分数。

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