前几天php实习面试,问到一个问题:如何将一个数组乱序?
答:使用自带的array_rand()或者shuffle()函数,或者用随机数取值赋值给新的数组。
又问:万一一直随机到同一个数怎么办?
那就进行判断,如果已经取过的位置,重新选取随机数。
这样问题就来了:随着新数组长度增加,原数组中的随机数选取碰撞几率会原来越大,最后几乎是一直碰撞的。也没有想出更好的办法。
后来回家后查了一下,总结一下,有以下几种方法:
- 使用自带的函数
function shuffle_rand1($arr)
{
echo "原来数组为:";
print_r($arr);
shuffle($arr);
echo "<br>乱序数组为:";
print_r($arr);
}
- 第一时间想到的方法,就是随机取值,赋值给新的数组
function shuffle_rand2($arr)
{
echo "原来数组为:";
print_r($arr);
$len = count($arr);
$shuffle_arr = array();
while(count($shuffle_arr)<$len){
$index = rand(0,$len-1);
if(!in_array($index, $shuffle_arr)){
$shuffle_arr[] = $index;
}
}
$newarr = array();
foreach ($shuffle_arr as $v) {
$newarr[] = $arr[$v];
}
echo "<br>新的数组为:";
print_r($newarr);
}
- 数组中随机取一个元素赋值给新的数组,然后将原数组最后一位赋值到该位置,数组长度减一,继续重复上述步奏
function shuffle_rand3($arr)
{
echo "原来数组为:";
print_r($arr);
$len = count($arr);
$shuffle_arr = array();
while($len>0){
$index = rand(0,$len-1);
$shuffle_arr[] = $arr[$index];
$arr[$index] = $arr[$len-1];
$len--;
}
echo "<br>新的数组为:";
print_r($shuffle_arr);
}
- 在具有n个元素的数组中,对0到n-1一次进行与一个随机位置元素进行交换,这种方法不需要新建一个数组,直接在原数组中进行
function shuffle_rand4($arr){
echo "原来数组为:";
print_r($arr);
$len = count($arr);
for($i=0;$i<$len;$i++){
$index = rand(0,$len-1);
$temp = $arr[$i];
$arr[$i] = $arr[$index];
$arr[$index] = $temp;
}
echo "<br>新的数组为:";
print_r($arr);
}