¿Es posible usar un ciclo while dentro de un ciclo?
-
03-07-2019 - |
Pregunta
Lo que estoy tratando de hacer es lo siguiente: tengo una matriz de valores, estos valores finalmente se usarán para generar una cadena única aleatoria, pero eso es un poco más tarde. Primero me gustaría recorrer todos los valores de la matriz (bucle foreach) y luego me gustaría limitar esto (bucle while) ¿Es este un método correcto para hacer esto?
El siguiente código no funciona, ¿alguien puede ver lo que estoy haciendo mal?
<?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)
{
}
}
?>
Solución
¿No deberías estar incrementando tu contador dentro del bucle while
, para que pueda salir?
Otros consejos
La mejor manera de ver qué está mal con un bucle (o cualquier otra estructura de control) es simplemente ejecutarlo. A veces puedes hacerlo en tu cabeza; en otras ocasiones, puede ser útil insertar puntos de rastreo en su código.
En este caso, creo que si simplemente ejecuta el código en su cabeza, podrá descubrir qué tiene de malo. Pero para fines didácticos, lo revisaré aquí. Primero numeremos cada línea 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
Ahora repasemos:
-
$array
se le asigna una matriz unidimensional:
array(0 => '1', 1 => '2', 2 => '3', ...)
-
$length
está establecido en 15 . -
$counter
es establecer 0 . - Comenzar
for loop
;$values
=$array[0]
= '1' . -
while loop
se incrementa.while
= 1 . - Comenzar <=>; compruebe que <=> ( 1 ) < = <=> ( 15 ).
- No hacer nada.
- Regrese a la línea 6.
- Línea 6: Si <=> ( 1 ) < = <=> ( 15 ), continúe el bucle.
- Línea 7: No hacer nada.
- Línea 8: Regrese a la línea 6.
- Línea 6: <=> ( 1 ) sigue siendo < = <=> ( 15 ), vuelva al bucle.
- Línea 7: No hacer nada.
- Línea 8: Regrese a la línea 6.
Como puede ver, está atrapado en un bucle infinito porque ni <=> ni <=> cambian los valores. Por lo tanto, la condición <=> en la línea 6 siempre se evalúa como verdadero (1 & Lt; = 15).
Todo el código que ha publicado es legítimo, pero claramente ha dejado algo fuera y esa es la parte que ayudará a responder esto ... De lo contrario, su contador $ permanece constante durante el ciclo while y nunca saldrá
¿Por qué no hacer algo como el siguiente código? Genera una clave con un bucle. Diablos, ¿por qué no hacer una función para generar claves?
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);