在一个排序数组中,如何随机每3个项目随机播放一次,但保持常规排序呢?

时间:2019-05-18 14:12:34

标签: php arrays sorting

我有一个排序的数组(按值),其编号从900000000000,而第一个数字表示一般定位编号,然后是所有其他数字。

该值将根据以前的计算获得一个数字,以形成一个过滤器得分。分数越高,具有该分数的项目通常排名越高。

903402.55
^ ^  ^
| |  |_ Describes individual score in sorting -> higher -> better
| |__ describes general score value in sorting -> higher -> better
|__ describes general category that forms sorting roughly 

现在,我有一个包含此类分数的数组,按分数DESC(高分数到低分数)排序。

[
'item_id_1' => 903402.55,
'item_id_2' => 903402.55,
'item_id_3' => 903402.52,
'item_id_4' => 903402.51,
'item_id_5' => 903402.40,
'item_id_6' => 903402.39,
'item_id_7' => 903402.37,
'item_id_8' => 903402.37,
'item_id_9' => 903402.21,
'item_id_10' => 903402.10,
'item_id_11' => 903402.08,
'item_id_12' => 903402.01,
]

,依此类推。

现在,我想对每个第3个项目进行洗牌,但要保持总体顺序,以使第四个项目不能成为整个数组的第二个项目,而位置1-3则分别在处理整个数组时缩放。

意味着我的潜在结果是这样的:

[
'item_id_3' => "now better then 1",
'item_id_1' => "now worse then 3 but better then 2",
'item_id_2' => "now worse then 1 but better then 5",
'item_id_5' => "now better then 4, can't change 3-group",
'item_id_4' => "now worse then 5",
'item_id_6' => "now worse then 4",
...
]

我要做的是将整个数组按3分组,这样我就得到了一个包含正确顺序的每3个元素的数组。

$i = 0;
        $shuffleGroup = [];
        foreach ($scores as $productId => $score) {
            $shuffleGroup[$i][$productId] = $score;
            if(count($shuffleGroup[$i]) === 3){
                $i++;
            }
        }

现在,我想对得分进行适当的操作以保持总体顺序,但随机分配3分。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

据我了解,这段代码首先将分数分为3分。

然后可能更改顺序,首先获取该组中的最高和最低分数,然后为该组中的3个项目分别分配一个新的随机数(在最小和最大之间,四舍五入到小数点后两位)(使用examples in the manual的算法生成的随机数。

然后重组整个数组,并使用arsort()按随机分数对结果进行排序...

$groups = array_chunk($scores, 3, true);
foreach($groups AS &$group) {
    $min = min($group);
    $max = max($group);
    foreach ( $group as &$score )    {
        $score = round($min + mt_rand() / mt_getrandmax() * ($max - $min),2);
    }
}
$newScores = array_merge(...$groups);
arsort($newScores);