Foros del Web » Programando para Internet » PHP »

random sin que se repitan hasta finalizar

Estas en el tema de random sin que se repitan hasta finalizar en el foro de PHP en Foros del Web. Hola tengo este codigo que estoy usando: Código PHP: <?php     $carpeta  =  "." ; /*Seleccionamos el directorio a recorrer*/      $dir  =  opendir ( $carpeta ); /*Abrimos el directorio*/      while ( ...
  #1 (permalink)  
Antiguo 05/11/2013, 18:28
Avatar de alette666  
Fecha de Ingreso: febrero-2010
Ubicación: En la luna
Mensajes: 277
Antigüedad: 14 años, 2 meses
Puntos: 5
Pregunta random sin que se repitan hasta finalizar

Hola tengo este codigo que estoy usando:

Código PHP:
<?php
    $carpeta 
".";/*Seleccionamos el directorio a recorrer*/
    
$dir opendir($carpeta);/*Abrimos el directorio*/
    
while ($elemento readdir($dir)){
        if (
$elemento != "." && $elemento != ".." && $elemento != "_random_ads.php"){/*Descartamos los ficheros que no nos interesa*/
        
$directorio[] = $elemento;
        }
    }
    
$campania_aleatoria array_rand($directorio);/*Selecciono algun elemento del array al azar*/
    
echo "<iframe height='250' width='300' frameborder='0' scrolling='no' allowtransparency='true' src=".$directorio[$campania_aleatoria]." hspace='2' vspace='2' marginheight='1' marginwidth='1'></iframe>";
    
closedir($dir);/*Cerramos el directorio*/
    
?>
No tengo que aclarar mucho, ya que lo q hace es randonizar los archivos de un directorio, en la cual se esta actualmente. Pero lo q me faltaria es que el random no se repita hasta no terminar el ultimo numero de cantidad de archivos dentro del directorio.

Ejemplo, tengo 10 archivos dentro de la carpeta:
Código:
1;2;3;4;5;6;7;8;9;10
Lo que quisiera es que no me haga esto
Código:
1;9;7;1;6;8;2;9;7;1;
Sino que me haga el random pero que se almacene en alguna variable para ir descartandola hasta que se haya utilizado el ultimo numero.

En realidad no estoy trabajando con numeros sino con titulos

amex.html
tara_vidente.html
renxo_septiembre.html
....
....
__________________
Y Sócrates dijo...Solo sé que no sé nada.
Entiende la filosofía como una búsqueda colectiva basada en el diálogo.
  #2 (permalink)  
Antiguo 05/11/2013, 19:03
Avatar de Cuervoo  
Fecha de Ingreso: octubre-2013
Mensajes: 165
Antigüedad: 10 años, 6 meses
Puntos: 43
Respuesta: random sin que se repitan hasta finalizar

Eso lo hace cada vez que carga la página, no? Y vos querés que cada vez que se cargue, muestre uno distinto.

Si está bien eso que entendí, podrías guardarlo en una variable session y verificar que no haya sido usada antes.

Código PHP:
Ver original
  1. do
  2. {
  3.     $campania_aleatoria = array_rand($directorio);
  4. } while (in_array($campania_aleatoria, $_SESSION['campanas']);
  5.  
  6. $_SESSION['campanas'][] = $campania_aleatoria;
  #3 (permalink)  
Antiguo 05/11/2013, 20:10
Avatar de alette666  
Fecha de Ingreso: febrero-2010
Ubicación: En la luna
Mensajes: 277
Antigüedad: 14 años, 2 meses
Puntos: 5
Respuesta: random sin que se repitan hasta finalizar

Cita:
Iniciado por Cuervoo Ver Mensaje
Si está bien eso que entendí, podrías guardarlo en una variable session y verificar que no haya sido usada antes.
Y como lo implementaria, ya que lo que esta dentro del do{ } es igual al q tengo en el codigo; o al mismo que tengo le agrego el DO??? y y el src del iframe src=".$directorio[$campania_aleatoria]." queda tal cual??? o cambiaria el codigo
__________________
Y Sócrates dijo...Solo sé que no sé nada.
Entiende la filosofía como una búsqueda colectiva basada en el diálogo.
  #4 (permalink)  
Antiguo 05/11/2013, 20:48
Avatar de Cuervoo  
Fecha de Ingreso: octubre-2013
Mensajes: 165
Antigüedad: 10 años, 6 meses
Puntos: 43
Respuesta: random sin que se repitan hasta finalizar

Claro, es lo mismo, lo que cambia es que agregás el archivo que vas a imprimir a un array para que después no lo repita

El resto queda igual, no tendrías que cambiar nada.

Mirá, quedaría asi:

Código PHP:
Ver original
  1. <?php
  2.     //tal cual como lo tenías
  3.     $carpeta = ".";/*Seleccionamos el directorio a recorrer*/
  4.     $dir = opendir($carpeta);/*Abrimos el directorio*/
  5.     while ($elemento = readdir($dir)){
  6.         if ($elemento != "." && $elemento != ".." && $elemento != "_random_ads.php"){/*Descartamos los ficheros que no nos interesa*/
  7.             $directorio[] = $elemento;
  8.         }
  9.     }
  10.    
  11.     //
  12.     //Acá agregamos...
  13.     //
  14.     //Si $_SESSION['campanas'] no está seteada,
  15.     //O tiene la misma cantidad de elementos que la cantidad de directorios (quiere decir que imprimió todos)...
  16.     //Le asignamos un array vacío
  17.     if (!isset($_SESSION['campanas']) || count($_SESSION['campanas']) == count($directorio))
  18.     {
  19.         $_SESSION['campanas'] = array();
  20.     }
  21.     do
  22.     {
  23.         $campania_aleatoria = array_rand($directorio);
  24.     } while (in_array($campania_aleatoria, $_SESSION['campanas']); //Repite la acción si la "campania" ya fue impresa
  25.    
  26.     //Una vez que tenemos una campania que todavia fue mostrada, la agregamos al array, para que después no la repita
  27.     $_SESSION['campanas'][] = $campania_aleatoria;
  28.    
  29.     //Imprime normalmente como lo tenías
  30.     echo "<iframe height='250' width='300' frameborder='0' scrolling='no' allowtransparency='true' src=".$directorio[$campania_aleatoria]." hspace='2' vspace='2' marginheight='1' marginwidth='1'></iframe>";
  31.     closedir($dir);/*Cerramos el directorio*/
  32.     ?>

Y con eso ya tendría que andar.
  #5 (permalink)  
Antiguo 05/11/2013, 20:55
Avatar de alette666  
Fecha de Ingreso: febrero-2010
Ubicación: En la luna
Mensajes: 277
Antigüedad: 14 años, 2 meses
Puntos: 5
Respuesta: random sin que se repitan hasta finalizar

Cita:
Iniciado por Cuervoo Ver Mensaje
Claro, es lo mismo, lo que cambia es que agregás el archivo que vas a imprimir a un array para que después no lo repita

El resto queda igual, no tendrías que cambiar nada.
Es-Pec-Ta-Cu-Lar!!!!!!!
__________________
Y Sócrates dijo...Solo sé que no sé nada.
Entiende la filosofía como una búsqueda colectiva basada en el diálogo.

Etiquetas: random
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:21.