我有一个排序的数组(按值),其编号从900000
到000000
,而第一个数字表示一般定位编号,然后是所有其他数字。
该值将根据以前的计算获得一个数字,以形成一个过滤器得分。分数越高,具有该分数的项目通常排名越高。
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分。
我该怎么做?
答案 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);