PHP 关于随机打乱部分数组顺序

2020-08-31 11:57:52 +08:00
 jrotty

就是一个学生成绩数组,然后按照学生分数总高到低排序,相同分数部分的学生顺序随机排序,我百度了半天没搜到,然后自己瞎弄如下:

<?php
$all=array(
        array('name'=>'zhangsan0','fenshu'=>'90'),
        array('name'=>'zhangsan1','fenshu'=>'89'),
        array('name'=>'zhangsan2','fenshu'=>'89'),
        array('name'=>'zhangsan3','fenshu'=>'70'),
        array('name'=>'zhangsan4','fenshu'=>'89'),
    );
foreach ( $all as $key => $row ){
  $idprice[$key] = $row['fenshu'];
  $r[$key] = rand(1,10);
}
array_multisort($idprice, SORT_DESC, $r, SORT_DESC, $all);
print_r($all);
?>

我想知道,有啥正统的解决方式吗?不要喷我哈,我知道我是真的菜!

2378 次点击
所在节点    PHP
16 条回复
dilu
2020-08-31 12:01:50 +08:00
请先定义一下:相同分数部分的学生顺序随机排序

顺序?以什么为顺序?

随机?已经顺序了怎么随机?
sanggao
2020-08-31 12:03:24 +08:00
相同分数的为啥要随机排序? 需求挺奇怪的 ,相同分数的自然排序不行吗
sanggao
2020-08-31 12:04:55 +08:00
@dilu 他可能想让学生名字(或者 id )随机排序。 但我认为这简直就是奇葩需求,这个随机的意义在哪?
sadfQED2
2020-08-31 12:05:21 +08:00
相同分数讲道理不应该用名字的拼音排序么
jrotty
2020-08-31 12:06:17 +08:00
@sanggao 只是那学生分数举个例子哈,只是想知道有没有什么好的方法
rming
2020-08-31 12:08:50 +08:00
用 usort,自定义排序规则
taozywu
2020-08-31 12:08:56 +08:00
整理一个新数组,以分数为 key,以 name 为值存一个二维。然后判断 name 中的数组个数大于 1 。就随机下 name 数组。
rming
2020-08-31 12:18:05 +08:00
Littlesqx
2020-08-31 12:23:42 +08:00
```PHP
$all = [
['name'=>'zhangsan0', 'score'=>'90'],
['name'=>'zhangsan1', 'score'=>'89'],
['name'=>'zhangsan2', 'score'=>'89'],
['name'=>'zhangsan3', 'score'=>'70'],
['name'=>'zhangsan4', 'score'=>'89'],
];

usort($all, function ($left, $right) {
if ($left['score'] === $right['score']) {
return rand(-1, 1);
}

return $right['score'] <=> $left['score'];
});

return $all;

// press Ctrl+Enter to run
```
jrotty
2020-08-31 12:57:44 +08:00
@rming
@Littlesqx
感谢两位大佬,我去学习下 usort 函数
lovecy
2020-08-31 15:08:13 +08:00
你这个问题,其实就是如何按数组内数据给数组排序,上 stackoverflow 搜一下肯定有
我搜了一下还蛮多的,给你个关键词
sort array in array [php]
lovecy
2020-08-31 15:11:02 +08:00
找到问题关键字搜寻答案,也是一种能力。面向搜索引擎编程就完事了
jrotty
2020-08-31 15:29:08 +08:00
@lovecy 感谢大佬授人以渔
jendon
2020-08-31 15:40:02 +08:00
LeetCode 第 384 题-打乱数组。Fisher-Yates 洗牌算法
依次将数组中的每个元素,与其到末尾[i, n-1]范围内的随机个元素交换,这样已交换过的元素不会再被交换;
for (int i = 0; i < n; ++i) {
swap(cur[i], cur[i + rand() % (n - i)]);
}
时间复杂度 O(n)
jendon
2020-08-31 15:44:24 +08:00
只是回答如何打乱数组这步
enjoyCoding
2020-09-01 10:56:18 +08:00
抖个机灵 可不可以不随机 用数据的随机性+排序制造出一个必然的随机
加入我有数据 8 9 5 3 2 1 5 1 5 6 6 4 8 2
如果我使用冒泡排序 排序之后的数据是按照在数据中出现的次序排序的, 数据中出现的次序是随机的 或者根据数据库入库时间排序 大概率是谁先交卷谁在后面
如果要求每次排序后的人名顺序都不一样 那我不机灵了...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/702778

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX