2010-02-24 15 views
12

de una matrizphp reciben dos elementos de la matriz aleatoria diferentes

$my_array = array('a','b','c','d','e'); 

quiero conseguir dos elementos aleatorios diferente.

con el siguiente código:

for ($i=0; $i<2; $i++) { 
    $random = array_rand($my_array); # one random array element number 
    $get_it = $my_array[$random]; # get the letter from the array 
    echo $get_it; 
} 

es posible obtener dos veces la misma letra. Necesito prevenir esto. Quiero obtener siempre dos elementos de matriz diferentes. ¿Puede alguien decirme cómo hacer eso? Gracias

Respuesta

6

Siempre puede eliminar el elemento que seleccionó la primera vez, luego no lo volvería a elegir. Si no desea modificar la matriz, cree una copia.

for ($i=0; $i<2; $i++) { 
    $random = array_rand($my_array); # one random array element number 
    $get_it = $my_array[$random]; # get the letter from the array 
    echo $get_it; 

    unset($my_array[$random]); 
} 
+0

suena bien. ¿Cómo puedo eliminar el elemento de la matriz? – creativz

+0

'unset ($ array [$ key])' – Franz

+0

'unset ($ my_array [$ random]);' – thetaiko

9

¿Qué tal esto?

$random = $my_array; // make a copy of the array 
shuffle($random); // randomize the order 
echo array_pop($random); // take the last element and remove it 
echo array_pop($random); // s.a. 
+0

+1 Más elegante – Franz

+1

Para arreglos muy grandes, esto puede ser bastante lento, aunque no es necesario barajar la matriz completa solo para obtener dos elementos . – Joey

+0

Eso no era parte de la especificación;). – middus

-1

Obtener el primero al azar, a continuación, utilizar un bucle do..while para obtener la segunda:

$random1 = array_rand($my_array); 
do { 
    $random2 = array_rand($my_array); 
} while($random1 == $random2); 

Esto se seguirá sonando hasta que random2 no es lo mismo que random1

+0

Esto no funcionará si 2 elementos son los mismos – pheelicks

+0

@pheelicks Debería funcionar porque array_rand devuelve un índice y no el elemento en sí. – middus

+0

D'oh. Lo siento, adam – pheelicks

17

array_rand() puede toma dos parámetros, la matriz y la cantidad de elementos (diferentes) que deseas elegir.

array_rand mixto (array $ entrada [, int $ num_req = 1])
$my_array = array('a','b','c','d','e'); 
foreach(array_rand($my_array, 2) as $key) { 
    echo $my_array[$key]; 
} 
+0

Me gusta este. Sin embargo, según los comentarios en php.net, el orden de los índices devueltos no es tan aleatorio. +1 de todos modos;) – middus

+0

@middus: ¿esto sigue siendo cierto para las versiones recientes de php? Ha habido una serie de quejas sobre algunas funciones aleatorias, esp. en win32. Pensé que habían sido (algo) corregidos. – VolkerK

+0

Realmente no lo sé. No lo he probado yo mismo. – middus

2
foreach (array_intersect_key($arr, array_flip(array_rand($arr, 2))) as $k => $v) { 
    echo "$k:$v\n"; 
} 

//or 

list($a, $b) = array_values(array_intersect_key($arr, array_flip(array_rand($arr, 2)))); 
1

aquí es una función simple que utilizo para tirar de múltiples elementos aleatorios de una matriz.

function get_random_elements($array, $limit=0){ 

    shuffle($array); 

    if ($limit > 0) { 
     $array = array_splice($array, 0, $limit); 
    } 

    return $array; 
} 
0

Así es como lo hice. Espero que esto ayude a alguien confundido.

$originalArray = array('first', 'second', 'third', 'fourth'); 
$newArray= $originalArray; 
shuffle($newArray); 
for ($i=0; $i<2; $i++) { 
    echo $newArray[$i]; 
} 
Cuestiones relacionadas