作者:一个人的孤独自白
原文:https://www.cnblogs.com/-mrl/p/10173912.html

写程序时从一个数组中随机获取几个元素,通过随机数很容易可以实现,但在程序中,有时我们又期望对同一个输入,随机输出的内容是固定的。通过写入缓存,可以实现这个功能,但是增加了代码的复杂性,需要写入、读取、管理缓存。如果不用缓存,可以对程序的输入变量做一些算法变化,使变量指向固定的数组下标,这样即可实现功能。

以下为网友的一种方法,通过$time标识来固定输出,不过测试时,程序报错PHP Parse error: syntax error, unexpected T_VARIABLE in /usercode/file.php on line 13,看了下是有特殊编码字符造成,我修复了字符编码问题,稍微改了下测试例子:

/* *
 * 通过一个标识,从一个数组中随机获取固定数据
 * $arr 数组
 * $num 获取的数量
 * $time 随机固定标识值,一般用固定时间或者某个固定整型
 * */
function getRandFixedData($arr, $num, $time = 0)
{
    if(empty($arr)){
        return $arr;
    }
    //获取绝对值,防止出现负数
    $time = abs($time);
    //数组的个数
    $listcount = count($arr);
    /*if($listcount < $num){
        //数组总数不能少于需要获取的数量
        return [];
    }*/
    $num = $listcount < $num ? $listcount : $num;
    //分成$num 个数组每一个数组是多少个元素
    $parem = floor($listcount / $num);
    //分成$num 个数组还余多少个元素
    $paremm = $listcount % $num;
    $start = 0;
    $new_array = [];
    for ($i = 0; $i < $num; $i++) {
        $end = $i < $paremm ? $parem + 1 : $parem;
        $new_array[$i] = array_slice($arr, $start, $end);
        $start = $start + $end;
    }
    if($time%2 == 1){
        //固定几率逆向排序
        $new_array = array_reverse($new_array);
    }
    $result = [];
    for ($j = 0; $j < $num; $j++) {
        $increase_num = $time+$j;
        $index = $increase_num % count($new_array[$j]);
        if($increase_num%3 == 1){
            //固定几率逆向排序
            $new_array[$j] = array_reverse($new_array[$j]);
        }
        $result[] = $new_array[$j][$index];
    }

    return $result;
}

//使用方法
$time = isset($_GET['time']) ? $_GET['time'] : 123456789;
$arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30];
$test1 = getRandFixedData($arr, 5, $time);
echo '<pre>';
print_r($test1);
echo '</pre>';

$data = [0, 1, 1, 2, 2];
foreach ($data as $v){
    $test2 = getRandFixedData($arr, 5, $time+$v);
    echo '<pre>';
    print_r($test2);
    echo '</pre>';
}

关键词:php数组
所属分类:网站技术
本文地址:https://me.i-i.me/article/24.html




评论提示: 点击头像可以回复评论

提交取消回复
[face]@
[uname]  [add_time]
[content]
[reply]
加载更多评论