0

该脚本应该获取一个多维数组并遍历这些值。

数组大小为 10,每个元素应包含一个关联数组:

$games[0] => array('foo' => 'bar')
$games[1] => array('foo1' => 'bar1')
etc..

在此示例中,while 循环应迭代 5 次。for 循环应该为 while 循环的每次迭代迭代 10 次。

所以我期待回声是:

countwhile = 5 countfor = 50 totalgames = 50

但我实际上得到

countwhile = 5 countfor = 150 totalgames = 150

我相信 $games 数组不是问题,因为我之前已经在下面进行过调用并使用 print_r 查看内容,并且符合预期。

整个代码不像我的 index.php 页面那样在函数或类中,问题可能与变量范围有关吗?

$totalruns = 5;  
$endindx = 10;
$startindx = 0;
$countwhile = 0;
$countfor = 0;
$totalfilesize = 0;
$totalgames = 0; 
$sizeof = 0; 

while($totalruns > 0)  
{  
     $games = $feedHandler->getGames($startindx, $endindx);  
     $sizeof = sizeof($games);  

     for($i=0; $i<$sizeof; $i++)  
     {  
          $totalfilesize += $games[$i]['swf_file_size'];
          $countfor++;  
     }  

     $startindx += 10;
     $endindx += 10;  
     $totalruns -= 1;  
     $totalgames += $sizeof;
     unset($games);  
}  

echo'<p>' . ' countwhile = ' . $countwhile . ' countfor = ' . $countfor . '</p>';
4

3 回答 3

3

问题1:

$sizeof = sizeof($games)-1;

解释1:

for($i=0, $sizeof = sizeof($games);$i<=$sizeof;$i++)  

以上将执行 11 次是sizeof($games)10
所以,要么

for($i=1, $sizeof = sizeof($games);$i<=$sizeof;$i++)  

or

for($i=0, $sizeof=sizeof($games)-1;$i<=$sizeof;$i++)  

问题2:

$e = sizeof($games);

解释2:

$e = count($games);  
...
$e += $e;

如果最终的大小$games是 50,你只需将其相加为 100
所以,这是某种逻辑问题

于 2010-12-30T16:13:45.230 回答
1

我知道答案已被接受,但我想我会重构并使它更干净一些。

function retrieveGamesInfo($limit, $start = 0)
{
  $feedHandler = new FeedHandler(); // ignore this, just for testing to simluate your call

  if ($start > $limit)
    throw new Exception("Start index must be within the limit");

  $result = Array(
    'TotalGames' => 0,
    'TotalFileSize' => 0
  );

  // iterate over the results in groups of 10
  $range = $start;
  while ($range < $limit)
  {
    $range_end = $range + 10; // change me to play with the grab amount
    if ($range_end > $limit)
      $range_end = $limit;

    // grab the next 10 entries
    $games = $feedHandler->getGames($range,$range_end);

    $result['TotalGames'] += count($games);

    foreach ($games as $game)
      $result['TotalFileSize'] += $game['swf_file_size'];

    $range = $range_end;
  }
  return $result;
}
var_dump(retrieveGamesInfo(50));

根据我阅读和吸收的所有内容,这应该是一个很好的补充。以上提供了以下结果:

array(2) {
  ["TotalGames"]=>
  int(50)
  ["TotalFileSize"]=>
  int(275520)
}
于 2010-12-30T17:34:09.150 回答
0

正如我在评论中所说,$e 在每个循环中都会被覆盖,所以最后在 $e 中所拥有的只是 $games *2 中元素的最后一个计数。添加了 ajreal 问题,这意味着结果是您的代码预期呈现的结果 :-) 我很确定您的最后一个 $game 不仅仅是 10 个元素,而是 50 个。安静肯定......但很难阅读。

于 2010-12-30T16:18:57.653 回答