Possível usar um loop while dentro de um loop?
-
03-07-2019 - |
Pergunta
O que estou tentando fazer é o seguinte: Eu tenho uma matriz de valores, esses valores acabará por ser usado para gerar uma cadeia exclusiva aleatória, mas isso é um pouco mais tarde. Primeiro eu gostaria de percorrer todos os valores na matriz (loop foreach), então eu gostaria de limitar este (while) é um método correto para fazer isso?
O código abaixo não funciona, alguém pode ver o que estou fazendo de errado?
<?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)
{
}
}
?>
Solução
Você não deveria ser incrementar seu contador dentro do ciclo while
, para que ele possa sair?
Outras dicas
A melhor maneira de ver o que está errado com um loop (ou qualquer outra estrutura de controle) é apenas para correr com ele. Às vezes você pode fazê-lo em sua cabeça; em outros momentos, pode ser útil para inserir pontos de rastreio em seu código.
Neste caso, eu acho que se você simplesmente executar o código em sua cabeça, você vai ser capaz de pegar o que há de errado com ele. Mas, para fins didáticos, eu vou correr com ele aqui. número Primeiro vamos cada linha de código:
$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
Agora vamos correr com ele:
-
$array
é atribuído uma matriz dimensional única:
array(0 => '1', 1 => '2', 2 => '3', ...)
-
$length
está definido para 15 . -
$counter
é definir 0 . - Comece
for loop
;$values
=$array[0]
= '1' . -
$counter
é incrementado.$counter
= 1 . - Comece
while loop
; verificar que$counter
( 1 ) <=$length
( 15 ). - Não faça nada.
- Volte para a linha 6.
- Linha 6:. Se
$counter
( 1 ) <=$length
( 15 ), continuar laço - Linha 7:. Do nada
- Linha 8:. Volte para a linha 6
- Linha 6:.
$counter
( 1 ) é ainda <=$length
( 15 ), entrar em ciclo novamente - Linha 7:. Do nada
- Linha 8:. Volte para a linha 6
Como você pode ver, você está preso em um loop infinito, porque nem $counter
nem $length
alterar valores. Assim, a condição while
em linha 6 sempre avalia a verdadeiro (1 <= 15).
Todo o código que você postou é legítimo, mas é evidente que você tem algo esquerda para fora e essa é a parte que vai ajuda responder a esta ... Caso contrário, o seu $ estadias contra constante durante o loop while e que nunca vai sair
Por que não fazer algo como o código abaixo, gera uma chave com um loop. Inferno, por que não fazer uma função para gerar chaves?
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);