Можно ли использовать цикл while внутри цикла? - PullRequest
0 голосов
/ 03 мая 2009

Я пытаюсь сделать следующее: у меня есть массив значений, эти значения в конечном итоге будут использованы для генерации случайной уникальной строки, но это немного позже. Сначала я хотел бы пройтись по всем значениям в массиве (цикл foreach), затем я хотел бы ограничить это (цикл while). Это правильный метод для этого?

Приведенный ниже код не работает, кто-нибудь может увидеть, что я делаю не так?

<?php 

    $array = array(
          '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 
          'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 
          'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 
          'u', 'v', 'w', 'x', 'y', 'z', '!', '£', '$', '%',
          '^', '&', '*', '(', ')', '_', '+', '{', '}'
    );

    $length_of_unique_key = 15;
    $counter = 0;

    foreach($array as $values)
    {
          $counter++;

          while ($counter <= $length_of_unique_key)
          {

          }
    }

?>

Ответы [ 4 ]

11 голосов
/ 03 мая 2009

Разве вы не должны увеличивать свой счетчик в цикле while, чтобы он мог выйти?

7 голосов
/ 03 мая 2009

Лучший способ увидеть, что не так с циклом (или любой другой структурой управления), - просто прогнать его. Иногда вы можете сделать это в своей голове; в других случаях может быть полезно вставить точки трассировки в ваш код.

В этом случае, я думаю, что если вы просто запустите код в своей голове, вы сможете понять, что с ним не так. Но для дидактических целей, я пробежусь через это здесь. Сначала давайте нумеруем каждую строку кода:

$array = array(...);               // line 1
$length = 15;                      // line 2
$counter = 0;                      // line 3
foreach($array as $values)         // line 4
{
      $counter++;                  // line 5
      while ($counter <= $length)  // line 6
      {
                                   // line 7
      }                            // line 8
                                   // line 9
}                                  // line 10

Теперь пройдемся по нему:

  1. $array присваивается одномерный массив:
    array(0 => '1', 1 => '2', 2 => '3', ...)
  2. $length установлено на 15 .
  3. $counter должен установить 0 .
  4. Начало for loop; $values = $array[0] = '1' .
  5. $counter увеличивается. $counter = 1 .
  6. Начало while loop; проверьте, что $counter ( 1 ) <= <code>$length ( 15 ).
  7. Ничего не делать.
  8. Вернитесь к строке 6.
  9. Строка 6: Если $counter ( 1 ) <= <code>$length ( 15 ), продолжить цикл.
  10. Строка 7: ничего не делать.
  11. Строка 8: вернуться к строке 6.
  12. Строка 6: $counter ( 1 ) по-прежнему <= <code>$length ( 15 ), снова войдите в цикл.
  13. Строка 7: ничего не делать.
  14. Строка 8: вернуться к строке 6.

Как видите, вы застряли в бесконечном цикле, потому что ни $counter, ни $length не меняют значения. Таким образом, условие while в строке 6 всегда оценивается как true (1 <= 15). </p>

0 голосов
/ 03 мая 2009

Весь код, который вы опубликовали, является допустимым, но, очевидно, вы что-то пропустили, и это часть, которая поможет ответить на этот вопрос ... В противном случае ваш $ counter остается постоянным в течение цикла while и никогда не выйдет

0 голосов
/ 03 мая 2009

Почему бы не сделать что-то вроде приведенного ниже кода, он генерирует ключ с одним циклом. Черт, почему бы не создать функцию для генерации ключей?

function keyval($length)
{
    $length_of_unique_key = $length;
    $array = array(
          '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 
          'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 
          'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 
          'u', 'v', 'w', 'x', 'y', 'z', '!', '£', '$', '%',
          '^', '&', '*', '(', ')', '_', '+', '{', '}'
    );
    for($i=0;$i<$length_of_unique_key;$i++)
    {
        $key.=$array[rand(0,sizeof($array)-1)];
    }
    return $key;
}

echo keyval(15);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...