Foros del Web » Programando para Internet » PHP »

Problema con array_rand

Estas en el tema de Problema con array_rand en el foro de PHP en Foros del Web. Hola, Tengo el siguiente array: $a = array(9, 26, 31, 42, 4, 2, 11, 13, 19, 20, 23, 24, 28, 30, 39, 39, 1, 5, ...
  #1 (permalink)  
Antiguo 04/07/2013, 02:32
Avatar de andy98  
Fecha de Ingreso: diciembre-2011
Mensajes: 32
Antigüedad: 12 años, 4 meses
Puntos: 2
Exclamación Problema con array_rand

Hola,

Tengo el siguiente array:

$a = array(9, 26, 31, 42, 4, 2, 11, 13, 19, 20, 23, 24, 28, 30, 39, 39, 1, 5, 14, 18, 36, 49, 15, 16, 25, 27, 33, 34);

$rand_keys = array_rand($a, 4);
asort($rand_keys);

Y cuando recupero en un foreach $rand_keys este me devuelve en alguna combinación el número 0 y el 0 no existe en el array.

¿Por que ocurre esto? y ¿Como se resuelve?
  #2 (permalink)  
Antiguo 04/07/2013, 02:47
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Problema con array_rand

Cómo usas el foreach?
reject note Valores devueltos

Si se está eligiendo únicamente una entrada, array_rand() devuelve la clave de una entrada al azar. De lo contrario, devuelve un array de claves para las entradas aleatorias. Esto se ha hecho de esta forma para que se pueda elegir claves al igual que valores al azar del array.
__________________
Fere libenter homines, id quod volunt, credunt.
  #3 (permalink)  
Antiguo 04/07/2013, 02:52
Avatar de andy98  
Fecha de Ingreso: diciembre-2011
Mensajes: 32
Antigüedad: 12 años, 4 meses
Puntos: 2
Respuesta: Problema con array_rand

foreach ($rand_keys as $key => $val) {
$i++;
if ($i < 4)
echo $val." - ";
else
echo $val;
}
  #4 (permalink)  
Antiguo 04/07/2013, 02:59
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Problema con array_rand

Y cuando recupero en un foreach $rand_keys este me devuelve en alguna combinación el número 0 y el 0 no existe en el array.


claro que sí, el valor 0 no existe pero la clave 0 sí:

Descripción
mixed array_rand ( array $input [, int $num_req = 1 ] )

Obtiene uno o más valores aleatorios de un array y devuelve la clave (o claves) de dichos valores aleatorios.
__________________
Fere libenter homines, id quod volunt, credunt.
  #5 (permalink)  
Antiguo 04/07/2013, 03:02
Avatar de andy98  
Fecha de Ingreso: diciembre-2011
Mensajes: 32
Antigüedad: 12 años, 4 meses
Puntos: 2
Respuesta: Problema con array_rand

¿Entonces yo pinto $key en $val o pinto el valor del array?
  #6 (permalink)  
Antiguo 04/07/2013, 03:08
Avatar de andy98  
Fecha de Ingreso: diciembre-2011
Mensajes: 32
Antigüedad: 12 años, 4 meses
Puntos: 2
Respuesta: Problema con array_rand

He puesto ahora así el foreach:

foreach ($rand_keys as $val) {

Y sigue devolviendo 0 en algunas combinaciones. ¿Podría ser el problema asort?
  #7 (permalink)  
Antiguo 04/07/2013, 03:19
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Problema con array_rand

Y sigue devolviendo 0 en algunas combinaciones. ¿Podría ser el problema asort? rand_keys() devuelve CLAVES no VALORES. Utiliza shuffle() para desordenar el array.
__________________
Fere libenter homines, id quod volunt, credunt.
  #8 (permalink)  
Antiguo 04/07/2013, 03:23
Avatar de andy98  
Fecha de Ingreso: diciembre-2011
Mensajes: 32
Antigüedad: 12 años, 4 meses
Puntos: 2
Respuesta: Problema con array_rand

$rand_keys = array_rand($a, 4);
asort($rand_keys);

for ($i = 0; $i < 4; $i++) {
if ($i < 3)
echo $rand_keys[$i]." - ";
else
echo $rand_keys[$i];
}

He hecho este cambio y aun así sigue devolviendo 0 y 0 no existe en el array.

Super-raro
  #9 (permalink)  
Antiguo 04/07/2013, 03:37
Avatar de andy98  
Fecha de Ingreso: diciembre-2011
Mensajes: 32
Antigüedad: 12 años, 4 meses
Puntos: 2
Respuesta: Problema con array_rand

Aporto otro dato:

Array ( [0] => 0 [1] => 16 [2] => 17 [3] => 33 ) 0 - 16 - 17 - 33

He comprobado que siempre es el elemento o la clave [0] la que da el fallo.
  #10 (permalink)  
Antiguo 04/07/2013, 06:15
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Problema con array_rand

El problema que veo hasta ahora es que se mete algo en posicion [0] pero es culpa de array_rand() ... si usas shuffle() no sucede eso, diria es un BUG de array_rand() porque en el manual no dice nada de que deba hacer eso

En tu caso, deberias hacer un shuffle() y luego solo mostrar los primeros 4 elementos ... la diferencia es que shuffle() es por referencia que acepta el array asi que lo modifica y no hace copia como array_rand()

Código PHP:
<?php

$a 
= array(926314242111319202324283039391514183649151625273334);

shuffle($a);

for (
$i 0$i 4$i++) {
    if (
$i 3)
        echo 
$a[$i]." - "
    else
        echo 
$a[$i]; 
}
Otra solucion es ignorar ese primer valor:

Código PHP:
<?php

$a 
= array(926314242111319202324283039391514183649151625273334);

$rand_keys array_rand($a5);
asort($rand_keys);

for (
$i 1$i 5$i++) {
    if (
$i 4)
        echo 
$rand_keys[$i]." - "
    else
        echo 
$rand_keys[$i]; 
}
__________________
Salu2!

Última edición por Italico76; 04/07/2013 a las 07:10
  #11 (permalink)  
Antiguo 04/07/2013, 13:09
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: Problema con array_rand

o.O que acaso no leen la documentación? array_rand() retorna el INDICE, mas no el valor por lo tanto SI existe el indice 0 que es el primer item dentro del array!

Código PHP:
Ver original
  1. <?php
  2. $a = array(9, 26, 31, 42, 4, 2, 11, 13, 19, 20, 23, 24, 28, 30, 39, 39, 1, 5, 14, 18, 36, 49, 15, 16, 25, 27, 33, 34);
  3.  
  4. $array_keys = array_rand($a,4);
  5.  
  6. foreach($array_keys as $key) {
  7.      echo $a[$key];
  8. }
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #12 (permalink)  
Antiguo 04/07/2013, 13:13
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Problema con array_rand

@Nemutagk: como le decia en otro hilo "sus observaciones son buenas" ... pero agrego "bajelé a la agresividad" por favor

Cita:
Iniciado por Nemutagk Ver Mensaje
o.O que acaso no leen la documentación?
__________________
Salu2!

Última edición por Italico76; 04/07/2013 a las 13:25

Etiquetas: php+arrays
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 13:28.