PHP如何获取两个不同的随机数组元素?

14

从一个数组中

 $my_array = array('a','b','c','d','e');
我想获取两个不同的随机元素。
使用以下代码:
 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;
 }

可能会出现两次相同的字母。我需要防止这种情况发生。我想要始终获得两个不同的数组元素。有人能告诉我如何做吗? 谢谢

8个回答

20

array_rand()函数接受两个参数,数组和要选择的(不同)元素数量。

mixed array_rand ( 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];
}

我喜欢这个。然而,根据php.net上的评论,返回索引的顺序并不是那么随机。无论如何+1 ;) - middus
@middus:对于最近版本的PHP,这仍然是真实的吗?有很多关于一些随机函数的抱怨,特别是在win32上。我认为它们已经(在某种程度上)得到了修复。 - VolkerK
我其实不知道。我自己没有测试过。 - middus

9

这个怎么样?

$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.

2
对于非常大的数组,这可能会相当慢,但是您肯定不必对整个数组进行洗牌才能获取两个元素。 - Joey
那不是规格的一部分 ;)。 - middus

7

您可以始终删除第一次选择的元素,这样就不会再选择它了。如果您不想修改数组,请创建一个副本。

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

1
为什么要使用循环?为什么不直接获取第一个随机值,从数组中删除它,然后获取第二个呢?您不需要删除第二个。 - Adam Hopkinson
2
我使用了循环,因为这意味着对 creativz 的代码进行最小更改。此外,它使得扩展代码以选择任意数量的元素变得容易。 - pheelicks

4

您可以将数组打乱并选择其中的两个元素。如果想要保留原始数组,请使用另一个变量。

$your_array=[1,2,3,4,5,6,7];
shuffle($your_array); // randomize the order
$your_array = array_slice($your_array, 0, 2); //pick 2

3
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

这是我用于从数组中提取多个随机元素的简单函数。

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

    shuffle($array);

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

    return $array;
}

0

这是我是如何做到的。希望这能帮助任何困惑的人。

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

-1

先获取第一个随机数,然后使用 do..while 循环来获取第二个:

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

这将循环执行,直到random2与random1不同为止。


@pheelicks 这应该可以工作,因为array_rand返回的是索引而不是元素本身。 - middus
这不是最优雅的解决方案(我认为 middus 更好),但确实可行。有任何反对意见或原因吗? - Adam Hopkinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接