Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何循环多维数组并相应地执行查询?_Php_Mysql - Fatal编程技术网

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

Php 如何循环多维数组并相应地执行查询?,php,mysql,Php,Mysql,现在已经很晚了,所以我想我已经筋疲力尽了,但我已经努力解决这个问题大约一个小时了,我找不到适合我的解决方案。基本上,代码查询数据库以找出游戏中有多少人,然后进行一点数学运算以比较人与人之间的得分。之后,它将使用玩家及其点数唯一的id填充数组。现在的问题是,我正在尝试比较一个数组,它包含了人和他们的积分列表,与一个数组,该数组包含了玩家将根据他们的等级获得的积分。我似乎不知道如何将两个阵列拉到一起并相应地分配点。代码如下: $game_id = 4; //will be replaced late

现在已经很晚了,所以我想我已经筋疲力尽了,但我已经努力解决这个问题大约一个小时了,我找不到适合我的解决方案。基本上,代码查询数据库以找出游戏中有多少人,然后进行一点数学运算以比较人与人之间的得分。之后,它将使用玩家及其点数唯一的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>";

}
$total_points=5000;
$distribution_数量=25;
$M=$U分配数量-1;
$K=($distribution\u quantity*$M)/2;
$difference=15;
$award_points=array();
$equation=($total_points-($K*$difference))/$distribution_quantity;
对于($z=$distribution\u quantity;$z>0;$z--){
$award_points[]=$equation=$equation+$difference;
}
foreach(奖励积分为$value){
回声$value.“
”; }
最新更新:

我想你误解我了

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

比如说

球员1在一场比赛中得到240分。 玩家2得到180分。 玩家3得到210。 等等等等

这意味着球员1获得了第一名。第三名选手获得第二名。第二名选手获得第三名

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

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

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


我希望这能让事情变得更清楚一点。

本来会有帮助的,但事情太多了

  • 在mysql\u查询和mysql\u fetch\u数组中使用$statquery两次是个坏主意

  • 以下代码对我来说没有意义(我不确定其他人是否理解)

  • 您的$award_积分是从哪里来支付您的第一个代码

  • 有更多的信息。。我可以用改进得多的代码更新这个答案

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

    请确认这是否是你所说的

        $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
    
    谢谢
    :)

    我要做的是对当前点的数组进行排序,以便;s按秩排序,然后在每个数组中循环,将新点添加到当前点。查看此处了解如何

    所以

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


    只要稍加努力,您可能会使每个数组成为一个简单的一维数组,从而使排序等更容易。

    我认为更改$award_points的结构可能会有所帮助,这样分数就是关键,排名就是价值

    array {
       345 => 1,
       267 => 2,
       265 => 3,
       .
       .   
    }
    
    现在,您可以简单地在$point_数组中循环,并从$award_points中获取相应的排名

    foreach ($point_array as $key => $arr) {
        $point_array[$key]['rank'] = $award_points[$arr['points']]
    }
    print_r($point_array);
    
    我还没有测试代码,但我认为它应该可以工作

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

    首先,让我们修改填充$point_数组的代码,如下所示:

    $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_数组提供以下结构(基于最新更新的示例),并按其点的降序排列:

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

    我希望我理解了您的需求,并且上述内容很有意义。

    那么这里的主要问题是什么?哪一行?我只需要获得$point_数组的帮助,该数组包含一个玩家列表和他们的统计数据积累,并将其与$award_点数进行比较。共有25名球员,他们的排名各不相同:1名是最好的,25名是最差的。$award_points数组包含25个数字的列表。我需要$point_数组中的玩家获得奖励,无论他们获得的排名有多少积分,这些数字都保存在$point_points1中。我没用过两次?2.它用玩家及其点数填充第一个数组。3.问题是如何让第二个数组与第一个数组进行交互。非常感谢,很抱歉一开始让人难以理解。没问题@NickSavage,也许我没能很好地理解它。很好,它现在起作用了:-)
    $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);