Foros del Web » Programando para Internet » PHP »

Obtener elementos de array al azar sin repetirse

Estas en el tema de Obtener elementos de array al azar sin repetirse en el foro de PHP en Foros del Web. Buenas nuevamente ^^ Tengo un array y necesito que me muestre 3 elementos al azar pero sin que estos se repitan. Se como hacer la ...
  #1 (permalink)  
Antiguo 25/06/2014, 19:44
 
Fecha de Ingreso: diciembre-2012
Mensajes: 5
Antigüedad: 11 años, 4 meses
Puntos: 0
Obtener elementos de array al azar sin repetirse

Buenas nuevamente ^^

Tengo un array y necesito que me muestre 3 elementos al azar pero sin que estos se repitan.

Se como hacer la iteración para generar los 3 elementos al azar pero no sé como hacer que no sé repitan.

He estado buscando pero los ejemplos que hay solo son para números al azar y no para datos ya puestos de antes.

El array es de la siguiente forma:
Código PHP:
Ver original
  1. (
  2.     [0] => 2
  3.     [1] => 2
  4.     [2] => 1
  5.     [3] => 3
  6.     [4] => 3
  7.     [5] => 3
  8.     [6] => 4
  9.     [7] => 4
  10.     [8] => 5
  11.     [9] => 5
  12.     [10] => 6
  13. )

Y la repetición la hago así:
Código PHP:
Ver original
  1. // La función randon_element es la que obtiene un elemento del array al azar
  2.   $nuevo_array = array();
  3.   for ($i=0; $i < 3; $i++) {
  4.     $nuevo_array[$i] = random_element($mi_array);
  5.   }

Como puedo hacer para que cada valor del $nuevo_array no se repita con el siguiente?

Agradecido de quien pueda ayudarme :)
  #2 (permalink)  
Antiguo 25/06/2014, 20:01
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Obtener elementos de array al azar sin repetirse

Código PHP:
Ver original
  1. <?php
  2.  
  3. $a = [2,2,1,3,3,3,4,4,5,5,6];
  4. $b = array_unique($a);
  5.  
  6. $count = count($b);
  7. for ($i=0;$i<$count;$i++)
  8. {
  9.     $ix = array_rand($b);
  10.     printf ("%d<br/>\n",$b[$ix]);
  11.     unset($b[$ix]);
  12. }
__________________
Salu2!
  #3 (permalink)  
Antiguo 25/06/2014, 20:37
 
Fecha de Ingreso: diciembre-2012
Mensajes: 5
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Obtener elementos de array al azar sin repetirse

Cita:
Iniciado por Italico76 Ver Mensaje
Código PHP:
Ver original
  1. <?php
  2.  
  3. $a = [2,2,1,3,3,3,4,4,5,5,6];
  4. $b = array_unique($a);
  5.  
  6. $count = count($b);
  7. for ($i=0;$i<$count;$i++)
  8. {
  9.     $ix = array_rand($b);
  10.     printf ("%d<br/>\n",$b[$ix]);
  11.     unset($b[$ix]);
  12. }
Gracias pero no funciona. Pasa que el array donde tiene los datos va a ir cambiando y no siempre será así, ademas necesito 3 valores al azar y no solo obtener los valores únicos.

¿Sabes alguna otra forma de que haga la comprobación para obtener solo 3 datos?
  #4 (permalink)  
Antiguo 25/06/2014, 20:55
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Obtener elementos de array al azar sin repetirse

Podrías hacerlo así:

Código PHP:
Ver original
  1. $array = array(2, 2, 1, 3, 3, 3, 4, 4, 5, 5, 6);
  2. $nuevo = array();
  3. $nuevo[] = $array[array_rand($array)];
  4. $i = 1;
  5. while ($i < 3)
  6.     if (!in_array($aux = $array[array_rand($array)], $nuevo)){
  7.         $nuevo[] = $aux;
  8.         $i++;
  9.     }

De ese modo, solo insertas un valor del array en el nuevo array si este no ha sido asignado previamente, hasta 3 valores como máximo. La función array_rand selecciona un valor aleatorio del array y devuelve su clave, por eso coloco el valor aleatorio entre corchetes [], para así asignar a $aux el valor obtenido. Puedes hacerlo más eficiente, si gustas.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 25/06/2014 a las 21:06 Razón: Línea repetida
  #5 (permalink)  
Antiguo 25/06/2014, 21:10
 
Fecha de Ingreso: diciembre-2012
Mensajes: 5
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Obtener elementos de array al azar sin repetirse

Cita:
Iniciado por Alexis88 Ver Mensaje
Podrías hacerlo así:

Código PHP:
Ver original
  1. $array = array(2, 2, 1, 3, 3, 3, 4, 4, 5, 5, 6);
  2. $nuevo = array();
  3. $nuevo[] = $array[array_rand($array)];
  4. $i = 1;
  5. while ($i < 3)
  6.     if (!in_array($aux = $array[array_rand($array)], $nuevo)){
  7.         $nuevo[] = $aux;
  8.         $i++;
  9.     }

De ese modo, solo insertas un valor del array en el nuevo array si este no ha sido asignado previamente, hasta 3 valores como máximo. La función [URL="http://www.php.net/manual/es/function.array-rand.php"][inline]array_rand[/inline][/URL] selecciona un valor aleatorio del array y devuelve su clave, por eso coloco el valor aleatorio entre corchetes [], para así asignar a $aux el valor obtenido. Puedes hacerlo más eficiente, si gustas.

Saludos
Es buen la idea, solo que no me toma los valores del array, es como si generara otros o los sumara.

En vez de elegir 1,2,3,4,5 o 6, me da 0, 7, 9 etc.

Porque da esos valores que no existen?

Gracias por toda la ayuda ^^
  #6 (permalink)  
Antiguo 25/06/2014, 21:14
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Obtener elementos de array al azar sin repetirse

Fíjate que actualicé el código, me habían faltado los corchetes.

Una prueba en vivo, generando cinco secuencias: http://ideone.com/ylsFv1

Saludos

Edito: Se me ocurre una solución más corta:

Código PHP:
Ver original
  1. $array = array(2, 2, 1, 3, 3, 3, 4, 4, 5, 5, 6);
  2. $aux = array_unique($array);
  3. shuffle($aux);
  4. echo implode(', ', array_chunk($aux, 3)[0]);

Primero, utilizo la función array_unique para generar un array a partir de los datos del array original pero con valores únicos, obviando las repeticiones existentes. Luego, con la función shuffle, mezclo los datos del array de valores únicos (el array auxiliar), enseguida, utilizo la función array_chunk para partir a este array en porciones de 3 elementos cada una, tomando la primera de ellas y uniendo a sus elementos con comas mediante la función implode, pudiendo así imprimir la secuencia de valores.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 26/06/2014 a las 01:26

Etiquetas: elementos
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 15:07.