php - while循环是itering双倍预期的时间和嵌套for循环迭代超过预期的1.5倍

时间:2010-12-30 16:00:08

标签: php loops iteration nested-loops

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

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

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

在此示例中,while循环应迭代5次。对于while循环的每次迭代,for循环应迭代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>';

3 个答案:

答案 0 :(得分: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 所以,它是某种逻辑问题

答案 1 :(得分: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)
}

答案 2 :(得分:0)

正如我在评论中所说的那样,$ e在每个循环中被覆盖,所以你在$ e中的结果只是$ games * 2中元素的最后一个数。 添加了ajreal问题这意味着结果是你的代码应该呈现的结果:-)而且我很确定你的最后一场$游戏不只是10个元素而是50.安静的确定......但是很难阅读。