2010-02-24 12 views
12

da un arrayphp ottengono due diversi elementi della matrice casuale

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

voglio ottenere due elementi casuali DIVERSI.

Con questo codice:

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; 
} 

è possibile ottenere due volte la stessa lettera. Devo impedirlo. Voglio ottenere sempre due diversi elementi dell'array. Qualcuno può dirmi come farlo? Grazie

risposta

6

È sempre possibile rimuovere l'elemento selezionato per la prima volta, quindi non lo si preleva più. Se non si desidera modificare la matrice, creare 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

suona bene. come posso rimuovere l'elemento dell'array? – creativz

+0

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

+0

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

9

Che dire di questo?

$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 Più elegante – Franz

+1

Per array molto grandi questo può essere piuttosto lento, anche se non è certo necessario mischiare l'array completo solo per ottenere due elementi . – Joey

+0

Questo non faceva parte delle specifiche;). – middus

-1

Prendi il primo caso, quindi utilizzare un ciclo do..while per ottenere la seconda:

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

Ciò manterrà loop fino random2 non è lo stesso di random1

+0

Questo non funzionerà se 2 elementi sono gli stessi – pheelicks

+0

@pheelicks Dovrebbe funzionare perché array_rand restituisce un indice e non l'elemento stesso. – middus

+0

D'oh. Spiacente, adam – pheelicks

17

array_rand() può prendere due parametri, la matrice e il numero di (diversi) elementi che si desidera selezionare.

array_rand mista ($ input array [, 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

Mi piace questo. Tuttavia, secondo i commenti su php.net, l'ordine degli indici restituiti non è così casuale. +1 in ogni caso;) – middus

+0

@middus: è ancora valido per le versioni recenti di php? Ci sono stati un certo numero di lamentele su alcune funzioni casuali, esp. su win32. Pensavo che fossero stati (in qualche modo) risolti. – VolkerK

+0

In realtà non lo so. Non l'ho provato da solo – 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

ecco una semplice funzione che uso per tirare più elementi casuali da una matrice.

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

    shuffle($array); 

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

    return $array; 
} 
0

Ecco come l'ho fatto. Speriamo che questo aiuti qualcuno confuso.

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