Ver Mensaje Individual
  #1 (permalink)  
Antiguo 04/10/2013, 10:44
Avatar de guardarmicorreo
guardarmicorreo
 
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años, 2 meses
Puntos: 84
Problema al generar un valor aleatorio sin que se repita

Tengo el siguiente método que lo que hace es generar un número aleatorio.

Para que no genere dos números aleatorios iguales, lo que hago es guardar cada número aleatorio en sesión, luego comparo el número con el array en sesión, si no está entonces retorno el valor y sino vuelvo a generar otro número aleatorio.

El problema es que hay un tramo del código en el que genera un valor nulo, entre que compara el valor e introduce la pregunta en sesión.

El resultado es que hay preguntas que se quedan con valor null.

En el código explico dónde creo que hay errores. Los cuales por más que los he buscado, pensado y analizado no los encuentro.

La función en el controlador que obtiene tanto amigos aleatorios como preguntas aleatorias sobre dicho amigo.

Código PHP:
Ver original
  1. /*
  2.     obtiene un amigo aleatorio y cinco preguntas sobre el
  3. */
  4. function play_start()
  5. {
  6.     if ( isset( $_SESSION['user_twitter'] ) AND $_SESSION['twitter_status'] == true )
  7.     {
  8.         //vacio la sesion con los numeros obtenidos aleatoriamente
  9.         //y la declaro de nuevo como array para utilizarla en el array_push del metodo
  10.         //getrandomvalues()
  11.         unset( $_SESSION['randomresult']['count'] );
  12.        
  13.         //obtengo los amigos en una sesion
  14.         gettruefriendslist();
  15.        
  16.         //instancio la clase personal
  17.         $newget                     = new Twitter_main();
  18.        
  19.         //obtengo un numero de amigo aleatorio
  20.         $getfriendrandom            = $newget->getrandomvalue( $_SESSION['gettruefriendslist'] );
  21.        
  22.         //guardo el amigo aleatorio en sesion
  23.         $_SESSION['randomresult']['friend'] = $_SESSION['gettruefriendslist'][$getfriendrandom];
  24.        
  25.         //instancio la clase Conectar
  26.         $newget2                    = new Conectar();
  27.        
  28.         //selecciono las preguntas y las guardo en array
  29.         $select                     = "SELECT * FROM questions";
  30.        
  31.         $result_conexion            = $newget2->conectar( $select );
  32.  
  33.         while ($result = mysqli_fetch_array( $result_conexion ))
  34.         {
  35.             $getquestions[] = $result;
  36.         }
  37.        
  38.        
  39.         //vacio la sesion con las preguntas
  40.         //y la declaro de nuevo como array para utilizarla en el array_push
  41.         unset( $_SESSION['randomresult']['questions'] );
  42.         $_SESSION['randomresult']['questions']= array();
  43.        
  44.         //VUELVO A VACIAR la sesion con los numeros obtenidos aleatoriamente
  45.         //y la declaro de nuevo como array para utilizarla en el array_push del metodo
  46.         //getrandomvalues()
  47.         unset( $_SESSION['randomresult']['count'] );
  48.        
  49.         $_SESSION['randomresult']['questions']= array();
  50.         //declaro questions como array
  51.         $questionsrandom = array();
  52.        
  53.         //obtengo todas las etiquetas
  54.         $tags = $newget->gettags();
  55.    
  56.         //busco 5 preguntas aleatorias
  57.         //y sustituyo [nombre] por el valor que deseo finalmente
  58.         for($i=0; $i<=4 ; $i++)
  59.            
  60.         {
  61.             //obtengo 5 numeros aleatorios
  62.                         //aquí es donde comienza el error
  63.             $getquestionrandom      = $newget->getrandomvalue ( $getquestions );
  64.            
  65.                         //no estoy seguro si el error está aquí al guardar de esta manera el valor en questionsrandom
  66.             //guardo las preguntas segun los numeros anteriores
  67.             array_push($questionsrandom, $getquestions[$getquestionrandom]);
  68.            
  69.             //instancio al metodo para hacer las sustituciones
  70.             $questionsrandom[$i]['question'] = $newget->setvaluestags($tags,
  71.             "@".$_SESSION['randomresult']['friend']['screen_name'], $questionsrandom[$i]['question']);
  72.         }
  73.         //finalmente lo guardo en sesion
  74.         array_push($_SESSION['randomresult']['questions'], $questionsrandom );
  75.     }
  76.        
  77. }

Aquí es donde genero los valores aleatorios, tanto para obtener el amigo como para las preguntas

Código PHP:
Ver original
  1. /*
  2.         genera un valor aleatorio de un array
  3.     */
  4.     public function getrandomvalue ( $imput )
  5.     {
  6.         if( empty( $_SESSION['randomresult']['count'] )
  7.             OR !is_array( $_SESSION['randomresult']['count'] ) )
  8.         {
  9.             $_SESSION['randomresult']['count'] = array();
  10.         }
  11.         if ( is_array( $imput ) )
  12.         {
  13.             //cuento los valores del array
  14.             $this->result = count ( $imput );
  15.            
  16.             //resto un valor para que random no escoja un valor no encontrado en el array
  17.             $this->result = $this->result - 1;
  18.            
  19.             //elijo un numero al azar
  20.             $this->result = mt_rand( 0, $this->result );
  21.            
  22.             /*$this->result = array_rand( $imput );*/
  23.             $inarray = in_array( $this->result, $_SESSION['randomresult']['count'] );
  24.             //no se si puede estar aquí el error, es otra posibilidad que he analizado pero no encuentro nada
  25.             if( $inarray === false )
  26.             {
  27.                 //guardo el valor en count
  28.                 array_push( $_SESSION['randomresult']['count'], $this->result );
  29.                 //finalmente retorno el numero escogido
  30.                 return $this->result;
  31.             }          
  32.             else
  33.             {
  34.                 $this->getrandomvalue( $imput );
  35.             }
  36.         }
  37.     }

La estructura del array que utilizo para las preguntas aleatorias son

Código PHP:
Ver original
  1. $getquestions array(10){
  2.   [0, 1, 2, ...] array(6){
  3.    [0]=> string(...)
  4.    ["id_question"] => string(...)
  5.    [1]=> string(...)
  6.    ["question"] => string(...)
  7.    [2]=> string(...)
  8.    ["id_typequestions"] => string(...)
  9.    }
  10. }

Quien necesite más de mi código solo tiene que pedirlo y si no compromete al sistema entonces lo aportaré sin problemas.

¿Alguien me puede ayudar a entender por qué obtengo preguntas con valor null?
__________________
Ayúdame a hacerlo por mi mismo.