簡體   English   中英

更改子數組的值

[英]Changing values of a sub array

該程序獲取一堆NFL球員的統計信息,計算他們的通過率,然后顯示所有信息。 它大部分已經完成,但是我在幾個不同的領域遇到了麻煩。

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

如何更改子數組中的值? 在calculate函數中,我創建了一個數組,其中保存了我所有的計算值。 經過多次嘗試,我發現由於while循環,每個值$ a,$ b,$ c和$ d都是其自己的數組。 我正在嘗試檢查任何子數組中的任何值是否大於2.375或小於0,如果是,則將其更改為2.375或0。我已經處理了3個小時,但是尚未找到有關如何遍歷每個子數組並更改每個單獨元素的解決方案。

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;
}

我也很難輸入玩家的名字,而且他們的合格率也很高。 我只能制作一個或另一個,但不能同時制作兩個。 我不確定是否是我的數組格式或foreach循環的問題。

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

這是一些我正在從文件中讀取的數據:

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

當前,關於變量i或僅顯示值,我遇到了很多錯誤:

值樣本:(試圖使它們不為負或超過〜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

您忘了在幾個地方把美元符號放在i前面,但是我主要是重寫了您的代碼以嘗試為您簡化代碼。 asort()正在訂購ASC並保留密鑰-但是您不需要保留密鑰。 如果要使用我的新usort()方法進行ASC排序,只需反轉太空飛船運算符( <=> )兩側的$a$b變量。

代碼:( 演示

$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("\n",$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);

輸出:

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,
  ),
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM