如何修改子数组的值?NFL球员数据处理程序技术问询
解决NFL球员统计程序中子数组值修改的问题
嘿,我来帮你搞定这个子数组修改的困扰!从你的描述来看,核心问题应该是在calculate函数的while循环里,你把球员数据赋值给了独立的$a、$b这类变量,这些变量只是原数组的副本,修改它们并不会同步到原数组里。下面给你具体的解决思路和示例:
核心思路:直接操作原数组的子元素
不要把每个球员的数据拆成独立变量,而是直接通过索引或者引用访问原数组中的子数组,这样修改后的值会直接存在原数组里,不会出现“修改了但没生效”的情况。
具体实现示例(假设你用PHP开发)
1. 先确保数据是可修改的数组
如果你的球员数据是从数据库查询来的(比如mysqli_fetch_assoc这类方法返回的结果),先把结果转成普通数组:
// 假设$dbResult是数据库查询结果集 $nflPlayers = []; while ($row = mysqli_fetch_assoc($dbResult)) { $nflPlayers[] = $row; // 把查询结果转成可修改的多维数组 }
2. 修改calculate函数,直接操作原数组
// 函数参数用&传引用,避免复制整个大数组,同时修改会同步到外部 function calculate(&$players) { $totalPlayers = count($players); $index = 0; while ($index < $totalPlayers) { // 直接从原数组的子元素中获取统计数据 $passAtt = $players[$index]['pass_att']; $passComp = $players[$index]['pass_comp']; $passYards = $players[$index]['pass_yards']; $passTd = $players[$index]['pass_td']; $passInt = $players[$index]['pass_int']; // 计算NFL官方传球率公式 $compPct = ($passComp / $passAtt) * 100; $ydsPerAtt = $passYards / $passAtt; $tdPct = ($passTd / $passAtt) * 100; $intPct = ($passInt / $passAtt) * 100; $passRating = ((($compPct - 30) / 20) + (($ydsPerAtt - 3) / 4) + (($tdPct * 2) / 5) + (2.375 - ($intPct * 2.5))) / 6 * 100; // 直接把计算结果存回原数组的子数组中 $players[$index]['pass_rating'] = round($passRating, 1); $index++; } } // 调用函数并验证结果 calculate($nflPlayers); // 输出所有球员信息(包括计算出的传球率) foreach ($nflPlayers as $player) { echo "球员:" . $player['name'] . "\n"; echo "传球次数:" . $player['pass_att'] . "\n"; echo "传球成功率:" . round(($player['pass_comp']/$player['pass_att'])*100,1) . "%\n"; echo "传球率:" . $player['pass_rating'] . "\n\n"; }
关键注意点
- 使用引用传递:函数参数
&$players确保函数内部对数组的修改直接作用于外部的原数组,不用额外返回数组再赋值。 - 避免独立变量副本:不要把
$players[$index]赋值给$a这类变量,除非你用引用赋值(比如$a = &$players[$index];),否则修改$a只是修改副本,原数组不会变。 - 数据类型确认:确保你的统计数据是数值类型(不是字符串),否则计算时会出错,可以用
(int)或(float)强制转换,比如$passAtt = (int)$players[$index]['pass_att'];。
内容的提问来源于stack exchange,提问作者Alex Names
相关产品推荐
相关产品推荐

