0

このコードがあるとしましょう:

<?php

$aLevel[] = 98;

function experience($L) {
 $a=0;
  for($x=1; $x<$L; $x++) {
    $a += floor($x+300*pow(2, ($x/7)));
    $aLevel[$x-1] = $a; // we minus one to comply with array
  }
 return floor($a/4);
}

for($L=1;$L<100;$L++) {
 echo 'Level '.$L.': '. number_format(experience($L)). '<br />';
}

echo $aLevel[0]; // Level 1 should output 0 exp
echo "<br />" . $aLevel[1]; // Level 2 should output 83 exp
// et cetera
?>

expを格納する配列を作成しようとしています。したがって、レベル 1$aLevel[0]で EXP は (当然) 0 になり、レベル 2$aLevel[1]で EXP は 83 などになります。

以下のコード...動作します。経験とレベルのループは機能しますが、配列は機能しません。

私は何を間違っていますか?

4

3 に答える 3

1

スコーピングの問題($aLevel関数内で使用されるものは外部と同じではありません)は別として、経験を何度も計算しています。$L = 98 のときはレベル 1 ~ 97 の経験値を計算し、$L = 99 のときはすべてやり直します。また、戻り値を 4 で割っていますが、配列に格納している値ではありません。

あなたがしようとしているアルゴリズムを私が理解していると仮定すると、これは私がそれを行う方法です:

function getExperienceByLevel ($maxLevel)
{
  $levels = array ();
  $current = 0;
  for ($i = 1; $i <= $maxLevel; $i++){
    $levels[$i - 1] = floor ($current / 4);
    $current +=  floor($i+300*pow(2, ($i/7)));
  }
  return $levels;
}


$aLevels = getExperienceByLevel (100);
for ($i = 0; $i < 100; $i++)
{
  echo 'Level ' . ($i + 1) . ': '. number_format($aLevels[$i]) . "<br />\n";
}
于 2012-09-27T00:46:24.953 に答える
0

配列は関数で設定されるため、グローバルスコープでは使用できません。

これは機能します(使用しない方が良いですglobalが、この場合は迅速で汚い解決策です): デモ

<?php 

$aLevel[] = 98;

function experience($L) {
global $aLevel;
 $a=0;
  for($x=1; $x<$L; $x++) {
    $a += floor($x+300*pow(2, ($x/7)));
    $aLevel[$x-1] = $a; // we minus one to comply with array
  }
 return floor($a/4);
}

for($L=1;$L<100;$L++) {
 echo 'Level '.$L.': '. number_format(experience($L)). '<br />';
}

echo $aLevel[0]; // Level 1 should output 0 exp
echo "<br />" . $aLevel[1]; // Level 2 should output 83 exp
// et cetera
?>
于 2012-09-27T00:14:56.950 に答える
0

$aLevel[] 配列は、関数の外ではアクセスできません (変数のスコープを参照してください)。スクリプトの最後で、 $aLevel には次のもののみが含まれます。

Array ( [0] => 98 ) 98

...関数内の $aLevel 配列は同じ変数ではないため、これは正しいです。

関数から $aLevel をメイン スクリプトに戻してみてください。

于 2012-09-27T00:18:58.693 に答える