php 从一个数组中随机获取固定数据

 

 

<?php

/* *
 * 通过一个标识,从一个数组中随机获取固定数据
 * $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);

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

die;

 

posted @ 2018-12-25 14:53  一个人的孤独自白  阅读(1107)  评论(0编辑  收藏  举报