2014-02-21 5 views
1

Я борюсь со следующим кодом и не могу найти его, чтобы исправить его. Страница загружается слишком долго, и появляется ошибка «Неустранимая ошибка: максимальное время выполнения 30 секунд».PHP во время выполнения цикла

Возможно, кто-то может объяснить или дать совет?

<?php 

    $i = 1; 
    $s = 1; 
    $limit = 21; 
    $seasons = 6; 

    while ($s < $seasons) { 
     if ($s < 10) { 
      $s = '0' . $s; 
     } 

     while ($i < $limit) { 

      if ($i < 10) { 
       $i = '0' . $i; 
      } 
      echo '<input type="checkbox" value="S' . $s . 'E' . $i . '" name="rate"/>S' . $s . 'E' . $i . '<br/>'; 
      ++$i; 
     } 
    } 
    ?> 

Спасибо

UPDATE:

После добавления $ S ++; в конце цикла firt код был решен из-за ошибок и длительной нагрузки, но он работает только один раз, не соблюдая условие $ seasons = 6. Любая идея, почему это произойдет? Я пытался удалить 0 префикс и он все еще не зацикливание до 6

UPDATE: проблема решена, второй цикл помещается в функцию, и она работала. Спасибо всем!.

FINAL VERSION

<?php 

    $s = 1; 
    $limit = 21; 
    $seasons = 7; 

    while ($s < $seasons) { 

     if ($s < 10) { 
      $s = '0' . $s; 
     } 

     episodes($s,$limit); 

    $s++; 
    } 

    function episodes($s,$limit){ 
    $i = 1; 

    while ($i < $limit) { 
      if ($i < 10) { 
       $i = '0' . $i; 
      }   
      echo '<input type="checkbox" value="S' . $s . 'E' . $i . '" name="rate"/>S' . $s . 'E' . $i . '<br/>';  
      ++$i; 
     } 
    } 

?> 
+1

Вы не увеличивающиеся '$ s' в любом месте, так что ** всегда ** будет меньше, чем' $ seasons' (бесконечный петля). Вы добавляете нуль к началу, но это не влияет на цикл ... это то, что нуль должен быть в конце? –

+0

@scrowler спасибо. Приращение S проблемы с длительной загрузкой страницы, и ошибок не обнаружено, но первый цикл работает только один раз, почему он не будет работать 5 раз, как $ seasons = 6 – devjs11

ответ

2

Во-первых, убедитесь, что вы сравниваете целые числа до целых чисел при выполнении Вашего сравнения. Это нормально, чтобы добавить «0» перед вашим номером, если вам это нужно для отображения, но сделать это в той части, которая генерирует значение дисплея, а не в самой $s переменной:

$s_formatted = str_pad($s, 2, '0', STR_PAD_LEFT); 
echo '<input type="checkbox" value="S' . $s_formatted . 'E' . $i . '" name="rate"/>S' . $s . 'E' . $i . '<br/>'; 
++$i; 

Это позволяет удалить префикс '0' в той части кода, где вы сейчас это делаете. Вы можете удалить эти строки:

if ($s < 10) { 
    $s = '0' . $s; 
} 

Наконец, убедитесь, что для увеличения $s. В вашем текущем коде $s < $seasons всегда истинно, потому что значение $s никогда не меняется.Если вы хотите $s увеличиваться с каждым контуром, увеличиваем его следующим образом:

$s++; 
+0

странный, но $ s_formatted ... не работает в моем случае. S отображается без 0. Также первый цикл, кажется, запускается только один раз до S1E20, но почему это не так продолжить S02E01? – devjs11

1
$s = '0' . $s; 

Это просто добавить префикс 0 перед тем $s, $s будет '01', '001', '0001' ... и так далее.

Затем сравните с целыми 6, $s будет преобразован в 1,

Так $s будет никогда над $seasons, то это вызовет бесконечный цикл.

То же самое с $i, бесконечный цикл фактически находится во вложенном цикле. (++$i;)

Если вы действительно хотите строку с префиксом 0, тогда вы должны проверить длину строки.

Пример:

if (strlen($s) < 10) { 
+0

спасибо вашим усилиям – devjs11

-1

вам не хватает $ С ++ конец вам внешний, а запустите этот код:

$i = 1; 
$s = 1; 
$limit = 21; 
$seasons = 6; 

while ($s < $seasons) { 
    if ($s < 10) { 
     $s = '0' . $s; 
    } 

    while ($i < $limit) { 

     if ($i < 10) { 
      $i = '0' . $i; 
     } 
     echo '<input type="checkbox" value="S' . $s . 'E' . $i . '" name="rate"/>S' . $s . 'E' . $i . '<br/>'; 
     ++$i; 
    } 
$s++; 
} 
+0

Откуда вы знаете, что он хочет увеличить '$ s' по одному каждый раз? Вы просто предполагаете - это может быть десять, связанное с утверждением if в начале ... это может быть что угодно. –

+0

@ scrowler, если он хочет увеличиваться более одного раза, он может просто изменить код $ ++ на $ s = $ s + $ anyTheNumberHeWantToIncrease, это не главная проблема здесь, главная проблема в том, что он пропустил increse $ s. ..я прав? –

+0

Вы правы в том, что он пропустил приращение/декремент этой переменной (у него, например, '++ $ i', но не' $ s') - но вы делаете удар в темноте со значением увеличить его. –

Смежные вопросы