V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jrotty
V2EX  ›  PHP

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

  •  
  •   jrotty · 2020-08-31 11:57:52 +08:00 · 2594 次点击
    这是一个创建于 1564 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    <?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);
    ?>
    

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

    16 条回复    2020-09-01 10:56:18 +08:00
    dilu
        1
    dilu  
       2020-08-31 12:01:50 +08:00
    请先定义一下:相同分数部分的学生顺序随机排序

    顺序?以什么为顺序?

    随机?已经顺序了怎么随机?
    sanggao
        2
    sanggao  
       2020-08-31 12:03:24 +08:00
    相同分数的为啥要随机排序? 需求挺奇怪的 ,相同分数的自然排序不行吗
    sanggao
        3
    sanggao  
       2020-08-31 12:04:55 +08:00
    @dilu 他可能想让学生名字(或者 id )随机排序。 但我认为这简直就是奇葩需求,这个随机的意义在哪?
    sadfQED2
        4
    sadfQED2  
       2020-08-31 12:05:21 +08:00 via Android
    相同分数讲道理不应该用名字的拼音排序么
    jrotty
        5
    jrotty  
    OP
       2020-08-31 12:06:17 +08:00
    @sanggao 只是那学生分数举个例子哈,只是想知道有没有什么好的方法
    rming
        6
    rming  
       2020-08-31 12:08:50 +08:00
    用 usort,自定义排序规则
    taozywu
        7
    taozywu  
       2020-08-31 12:08:56 +08:00
    整理一个新数组,以分数为 key,以 name 为值存一个二维。然后判断 name 中的数组个数大于 1 。就随机下 name 数组。
    rming
        8
    rming  
       2020-08-31 12:18:05 +08:00
    Littlesqx
        9
    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
        10
    jrotty  
    OP
       2020-08-31 12:57:44 +08:00
    @rming
    @Littlesqx
    感谢两位大佬,我去学习下 usort 函数
    lovecy
        11
    lovecy  
       2020-08-31 15:08:13 +08:00
    你这个问题,其实就是如何按数组内数据给数组排序,上 stackoverflow 搜一下肯定有
    我搜了一下还蛮多的,给你个关键词
    sort array in array [php]
    lovecy
        12
    lovecy  
       2020-08-31 15:11:02 +08:00
    找到问题关键字搜寻答案,也是一种能力。面向搜索引擎编程就完事了
    jrotty
        13
    jrotty  
    OP
       2020-08-31 15:29:08 +08:00
    @lovecy 感谢大佬授人以渔
    jendon
        14
    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
        15
    jendon  
       2020-08-31 15:44:24 +08:00
    只是回答如何打乱数组这步
    enjoyCoding
        16
    enjoyCoding  
       2020-09-01 10:56:18 +08:00
    抖个机灵 可不可以不随机 用数据的随机性+排序制造出一个必然的随机
    加入我有数据 8 9 5 3 2 1 5 1 5 6 6 4 8 2
    如果我使用冒泡排序 排序之后的数据是按照在数据中出现的次序排序的, 数据中出现的次序是随机的 或者根据数据库入库时间排序 大概率是谁先交卷谁在后面
    如果要求每次排序后的人名顺序都不一样 那我不机灵了...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3009 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 11:52 · PVG 19:52 · LAX 03:52 · JFK 06:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.