dongzhijing8202 2018-03-03 21:41
浏览 70
已采纳

更改子数组的值

This program takes a bunch of NFL player's stats, calculates their passing rates and then displays all of the information. It's mostly completed but I'm having trouble in a few different areas.

$rate = "";
$file = 'purposely took the file location out';
$fp = fopen($file, 'r');
$name = "";
$team = "";
$completions = "";
$attempts = "";
$yards = "";
$touchdowns = "";
$interceptions = "";

function getNflStats($file){
@ $fp = fopen($file, 'r');


if(!$fp){
    echo "Could not open the file!<br/>";
    exit;
}

$nflStats = array();

while($data = fgetcsv($fp,255,',')){
    $name = $data[0];
    $team = $data[1];
    $completions = $data[2];
    $attempts = $data[3];
    $yards = $data[4];
    $touchdowns = $data[5];
    $interceptions = $data[6];
    $rate = Calculate($completions, $attempts, $yards, $touchdowns, 
    $interceptions);
    $nflStats[] = array("name"=>$rate);
}
fclose($fp);
return $nflStats;
}

How do I go about changing the values in a sub-array? Within the calculate function I have created an array that holds all of my calculated values. Through lots of attempts, I figured out that each of those values $a,$b,$c, and $d is its own array because of the while loop. I'm trying to check whether any value in any of the sub-arrays is above 2.375 or below 0 and if so, I will then change that value to be 2.375 or 0. I've been working on this for 3 hours but have yet to find a solution on how to run through each of the sub-arrays and change each individual element.

function Calculate($completions, $attempts, $yards, $touchdowns, 
$interceptions){
$a = ($completions/$attempts - .3) * 5;
$b = ($yards/$attempts - 3) * .25;
$c = ($touchdowns/$attempts) * 20;
$d = (2.375 - ($interceptions/$attempts *25));

$result = array($a,$b,$c,$d);
echo "$result[0] <br/>";
$size = count($result[0]);
foreach($result as $value){
  for($i=0;$i < $size; $i++){
    if($result[i] > 2.375){
            $result[i] = 2.375;
    }
  }
}
$passRating = round((($a + $b + $c + $d)/6) * 100, 2);

return $passRating;
}

I'm also having trouble displying the player's name and they're passing rate. I can only ever produce one or the other but not both at the same time. I'm unsure whether its an issue with my array formatting or foreach loop.

function displayStats($nflStats){

    asort($nflStats);

    echo "<table>";
    echo "<thead><tr>
       <td><h2>Player</h2></td>
       <td></td>
       <td><h2>Rating</h2></td>
       </tr></thead>";

    foreach($nflStats as $stats){
        echo "<tr>
            <td>{$stats['name']}</td>
            <td></td>
            <td style='text-align:right'></td>
          </tr>";
    }

    echo "</table>";
}

displayStats($nflStats);
?>

Here is some of the data that I'm reading from the file:

Tom Brady,NE,385,581,4577,32,8
Philip Rivers,LAC,360,575,4515,28,10
Matthew Stafford,DET,371,565,4446,29,10
Drew Brees,NO,386,536,4334,23,8
Ben Roethlisberger,PIT,360,561,4251,28,14
Matt Ryan,ATL,342,529,4095,20,12
Kirk Cousins,WAS,347,540,4093,27,13
Alex Smith,KC,341,505,4042,26,5
Russell Wilson,SEA,339,553,3983,34,11
Jared Goff,LA,296,477,3804,28,7
Blake Bortles,JAX,315,523,3687,21,13
Case Keenum,MIN,325,481,3547,22,7
Jameis Winston,TB,282,442,3504,19,11
Derek Carr,OAK,323,515,3496,22,13
Eli Manning,NYG,352,571,3468,19,13
Dak Prescott,DAL,308,490,3324,22,13
Andy Dalton,CIN,297,496,3320,25,12
Cam Newton,CAR,291,492,3302,22,16
Carson Wentz,PHI,265,440,3296,33,7
Marcus Mariota,TEN,281,453,3232,13,15
Joe Flacco,BAL,352,549,3141,18,13
Jacoby Brissett,IND,276,469,3098,13,7
Josh McCown,NYJ,267,397,2926,18,9

Currently I'm getting a bunch of errors regarding the variable i or just the values show:

sample of values: (trying to get them to not be negative or over ~158)

-12.8
-11.25
27.08
31.25
31.77
35.42
46.65
55.06
55.85
60.5
63.39
65.79
66.39
68.15
69.23
70.6
71.44
71.92
71.92
71.99
72.34
72.47
72.53
73.3
75.61
76.37
76.88
77.5 172.92
206.25
214.58
254.17
268.75
577.08
631.25

  • 写回答

1条回答 默认 最新

  • doushiposong30622 2018-03-04 02:54
    关注

    You forgot to put the dollar sign in front of i in a couple of places, but I've mostly rewritten your code to try to streamline it for you. asort() was ordering ASC and preserving the keys -- but you didn't need to preserve the keys. If you want ASC ordering with my new usort() method, just reverse the $a and $b variables on either side of the spaceship operator (<=>).

    Code: (Demo)

    $csv=<<<CSV
    Tom Brady,NE,385,581,4577,32,8
    Philip Rivers,LAC,360,575,4515,28,10
    Matthew Stafford,DET,371,565,4446,29,10
    Drew Brees,NO,386,536,4334,23,8
    Ben Roethlisberger,PIT,360,561,4251,28,14
    Matt Ryan,ATL,342,529,4095,20,12
    Kirk Cousins,WAS,347,540,4093,27,13
    Alex Smith,KC,341,505,4042,26,5
    Russell Wilson,SEA,339,553,3983,34,11
    Jared Goff,LA,296,477,3804,28,7
    Blake Bortles,JAX,315,523,3687,21,13
    Case Keenum,MIN,325,481,3547,22,7
    Jameis Winston,TB,282,442,3504,19,11
    Derek Carr,OAK,323,515,3496,22,13
    Eli Manning,NYG,352,571,3468,19,13
    Dak Prescott,DAL,308,490,3324,22,13
    Andy Dalton,CIN,297,496,3320,25,12
    Cam Newton,CAR,291,492,3302,22,16
    Carson Wentz,PHI,265,440,3296,33,7
    Marcus Mariota,TEN,281,453,3232,13,15
    Joe Flacco,BAL,352,549,3141,18,13
    Jacoby Brissett,IND,276,469,3098,13,7
    Josh McCown,NYJ,267,397,2926,18,9
    CSV;
    
    function Calculate($completions, $attempts, $yards, $touchdowns, $interceptions){
        $result=[
            min(2.375, ($completions/$attempts - .3) * 5),
            min(2.375, ($yards/$attempts - 3) * .25),
            min(2.375, $touchdowns/$attempts * 20),
            min(2.375, 2.375 - ($interceptions/$attempts *25))
        ];
        // min() will ensure that no value will exceed 2.375 (avoiding looped conditional entirely)
        return round(array_sum($result)/6*100, 2);  // calculated passingRate
    }
    
    // foreach()...explode()...str_csv() is just for demo'ing purposes, you can use your existing process
    foreach(explode("
    ",$csv) as $line){
        list($name,$team,$completions,$attempts,$yards,$touchdowns,$interceptions)=str_getcsv($line,",");
        $NFL_Stats[]=['team'=>$team,'name'=>$name,'passingRate'=>Calculate($completions, $attempts, $yards, $touchdowns, $interceptions)];
    }
    usort($NFL_Stats,function($a,$b){return $b['passingRate']<=>$a['passingRate'];});  // order by passingRate DESC
    var_export($NFL_Stats);
    

    Output:

    array (
      0 => 
      array (
        'team' => 'KC',
        'name' => 'Alex Smith',
        'passingRate' => 104.74,
      ),
      1 => 
      array (
        'team' => 'NO',
        'name' => 'Drew Brees',
        'passingRate' => 103.87,
      ),
      2 => 
      array (
        'team' => 'NE',
        'name' => 'Tom Brady',
        'passingRate' => 102.75,
      ),
      3 => 
      array (
        'team' => 'PHI',
        'name' => 'Carson Wentz',
        'passingRate' => 101.86,
      ),
      4 => 
      array (
        'team' => 'LA',
        'name' => 'Jared Goff',
        'passingRate' => 100.48,
      ),
      5 => 
      array (
        'team' => 'DET',
        'name' => 'Matthew Stafford',
        'passingRate' => 99.33,
      ),
      6 => 
      array (
        'team' => 'MIN',
        'name' => 'Case Keenum',
        'passingRate' => 98.3,
      ),
      7 => 
      array (
        'team' => 'LAC',
        'name' => 'Philip Rivers',
        'passingRate' => 95.96,
      ),
      8 => 
      array (
        'team' => 'SEA',
        'name' => 'Russell Wilson',
        'passingRate' => 95.39,
      ),
      9 => 
      array (
        'team' => 'NYJ',
        'name' => 'Josh McCown',
        'passingRate' => 94.51,
      ),
      10 => 
      array (
        'team' => 'WAS',
        'name' => 'Kirk Cousins',
        'passingRate' => 93.85,
      ),
      11 => 
      array (
        'team' => 'PIT',
        'name' => 'Ben Roethlisberger',
        'passingRate' => 93.37,
      ),
      12 => 
      array (
        'team' => 'TB',
        'name' => 'Jameis Winston',
        'passingRate' => 92.24,
      ),
      13 => 
      array (
        'team' => 'ATL',
        'name' => 'Matt Ryan',
        'passingRate' => 91.36,
      ),
      14 => 
      array (
        'team' => 'DAL',
        'name' => 'Dak Prescott',
        'passingRate' => 86.64,
      ),
      15 => 
      array (
        'team' => 'CIN',
        'name' => 'Andy Dalton',
        'passingRate' => 86.59,
      ),
      16 => 
      array (
        'team' => 'OAK',
        'name' => 'Derek Carr',
        'passingRate' => 86.36,
      ),
      17 => 
      array (
        'team' => 'JAX',
        'name' => 'Blake Bortles',
        'passingRate' => 84.68,
      ),
      18 => 
      array (
        'team' => 'IND',
        'name' => 'Jacoby Brissett',
        'passingRate' => 81.67,
      ),
      19 => 
      array (
        'team' => 'CAR',
        'name' => 'Cam Newton',
        'passingRate' => 80.69,
      ),
      20 => 
      array (
        'team' => 'BAL',
        'name' => 'Joe Flacco',
        'passingRate' => 80.42,
      ),
      21 => 
      array (
        'team' => 'NYG',
        'name' => 'Eli Manning',
        'passingRate' => 80.37,
      ),
      22 => 
      array (
        'team' => 'TEN',
        'name' => 'Marcus Mariota',
        'passingRate' => 79.27,
      ),
    )
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀