2010-02-24 10 views
12

partir d'un tableauphp obtenir deux éléments de tableau aléatoire différents

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

Je veux obtenir deux différents éléments aléatoires.

Avec le code suivant:

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

il est possible d'obtenir deux fois la même lettre. J'ai besoin d'empêcher ça. Je veux toujours avoir deux éléments de tableau différents. Quelqu'un peut-il me dire comment faire cela? Remerciements

Répondre

6

Vous pouvez toujours supprimer l'élément que vous avez sélectionné la première fois, puis vous ne le récupérez pas à nouveau. Si vous ne voulez pas modifier le tableau, créez une copie.

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

sonne bien. comment puis-je supprimer l'élément de tableau? – creativz

+0

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

+0

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

9

Que pensez-vous de cela?

$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 Plus élégant – Franz

+1

Pour les très grandes baies, cela peut être assez lent, bien que vous n'ayez pas besoin de mélanger le tableau complet pour obtenir deux éléments . – Joey

+0

Cela ne faisait pas partie de la spécification;). – middus

-1

Obtenez le premier aléatoire, puis utiliser une boucle do..while pour obtenir le deuxième:

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

Cela permet de garder en boucle jusqu'à ce que random2 n'est pas la même chose que aléatoire1

+0

Cela ne fonctionnera pas si 2 éléments sont identiques – pheelicks

+0

@pheelicks Cela devrait fonctionner car array_rand renvoie un index et non l'élément lui-même. – middus

+0

D'oh. Désolé adam – pheelicks

17

array_rand() peut prenez deux paramètres, le tableau et le nombre d'éléments (différents) que vous voulez choisir.

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

J'aime celui-ci. Cependant, d'après les commentaires sur php.net, l'ordre des indices renvoyés n'est pas si aléatoire. +1 de toute façon;) – middus

+0

@middus: est-ce toujours vrai pour les versions récentes de php? Il y a eu un certain nombre de plaintes au sujet de certaines fonctions aléatoires, esp. sur win32. Je pensais qu'ils ont été (un peu) réparés. – VolkerK

+0

Je ne sais pas vraiment. Je ne l'ai pas testé moi-même. – 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

est ici une fonction simple j'utiliser pour tirer plusieurs éléments aléatoires à partir d'un tableau.

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

    shuffle($array); 

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

    return $array; 
} 
0

Voici comment je l'ai fait. J'espère que cela aide quelqu'un qui est confus.

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