• 给专家分配作品


    引言: 前些天项目里遇见一个需求, 给专家分配作品, 觉得还蛮有趣, 感兴趣的同学可以读下去, 阅读此文大概需要...(我也不知道几分钟...

    1: 见图

    这个需求是这样子的, 要给选中的专家分配作品, 有两种情况,

    1: 每位专家部分作品, 也就是均分, 如果作品均分完还有余数, 则再继续分, 直至分完结束.

    2: 每位专家评审所有作品, 也就是所有作品都会被每位专家评审.

    因为存在一对多及多对多的关系, 首先要先建张表, 表里有三个字段, 主键id, 作品id, 专家id,  如下:

    ok, 建好数据表之后我们暂时先看其中一种 "每位专家部分作品" ,

    做这个每位专家部分作品前, 先来看以下代码,   "给老师分书":

        public function expertDistributionAction()
        {
            $book = [1,2,3,4,5,6,7,8,9,10,11,12,13,14];     //14本书
            $doc = 4;   //4个老师
            $arr = [];
            $z = (int)(count($book)/$doc);      //整数 3
            $y = count($book)%$doc;             //余数 2
            $un = [];
    
            //分配整数, 循环老师
            for ($i = 0 ; $i < $doc; $i++){
    
                for($j = 0; $j < $z ; $j++){
                    $arr[$i]['book'][] = $book[$j];
                    //把已经分配的数放入$un数组里
                    array_push($un,$j);     //$un = [0,1,2];
                }
    
                //把已经分配的给unset掉
                for($d = 0; $d < count($un) ; $d++){
                    unset($book[$un[$d]]);
                }
    
                //重建索引
                $book = array_values($book);            //$book = [4,5,---14]
            }
    
            //余数分配, 即每人一本
            for($i = 0; $i < $y ; $i++){        //$y = 2;
                $arr[$i]['book'][] = $book[$i];
            }
    
            return $arr;
        }

    上面的注释已经写的蛮清楚, 这个分书的算法要注意的是以下几点:

    1: 第一层是循环老师人数, 这个很关键

    2: 分配完的书需要在数组里去掉

    3: 去掉分配完的书后数组 "重建索引", 分完一个老师重建一次

    了解分书的逻辑后就开始代码了    (未完待续...

  • 相关阅读:
    【Linux基础】linux下修改ls显示的时间格式
    【Teradata】gtwglobal查看
    【Teradata】tdlocaledef修改默认日期配置
    【Linux基础】文件处理实例
    【Linux基础】awk命令
    【teradata】强制解锁
    第1节:保存文档
    Centos7安装MySQL数据库
    MyBatis框架之异常处理
    spring事务源码分析
  • 原文地址:https://www.cnblogs.com/cyfm/p/7551125.html
Copyright © 2020-2023  润新知