php - цикл циклический в два раза превышает ожидаемое, а вложенный цикл в 1,5 раза повторяет ожидаемый - PullRequest
0 голосов
/ 30 декабря 2010

Этот скрипт должен получить многомерный массив и выполнить итерацию значений.

Размер массива равен 10, и каждый элемент должен содержать ассоциативный массив:

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

цикл должен повторяться 5 раз в этом примере.Цикл for должен повторяться 10 раз для каждой итерации цикла while.

Так что я ожидаю, что эхо будет:

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 ]

3 голосов
/ 30 декабря 2010

задача 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 голос
/ 30 декабря 2010

Я знаю, что ответ принят, но подумал, что я бы реорганизовал и сделал его немного более чистым.дополнение.Выше приведен следующий результат:

array(2) {
  ["TotalGames"]=>
  int(50)
  ["TotalFileSize"]=>
  int(275520)
}
0 голосов
/ 30 декабря 2010

Как я уже сказал в моем комментарии, $ e перезаписывается в каждом цикле, поэтому в конце $ e у вас есть только последнее число элементов в $ games * 2. В добавление к проблемам с реальными проблемами это означает, что ваш код должен отображать результаты :-), и я уверен, что ваша последняя игра $ не просто 10 элементов, а 50. Тихо, конечно ... но ее трудно прочитать.

...