作者:一个人的孤独自白
原文: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
评论