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)
          {

          }
    }

?>
¿Fue útil?

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:

  1. $array se le asigna una matriz unidimensional:
    array(0 => '1', 1 => '2', 2 => '3', ...)
  2. $length está establecido en 15 .
  3. $counter es establecer 0 .
  4. Comenzar for loop; $values = $array[0] = '1' .
  5. while loop se incrementa. while = 1 .
  6. Comenzar <=>; compruebe que <=> ( 1 ) < = <=> ( 15 ).
  7. No hacer nada.
  8. Regrese a la línea 6.
  9. Línea 6: Si <=> ( 1 ) < = <=> ( 15 ), continúe el bucle.
  10. Línea 7: No hacer nada.
  11. Línea 8: Regrese a la línea 6.
  12. Línea 6: <=> ( 1 ) sigue siendo < = <=> ( 15 ), vuelva al bucle.
  13. Línea 7: No hacer nada.
  14. 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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top