引言: 前些天项目里遇见一个需求, 给专家分配作品, 觉得还蛮有趣, 感兴趣的同学可以读下去, 阅读此文大概需要...(我也不知道几分钟...
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: 去掉分配完的书后数组 "重建索引", 分完一个老师重建一次
了解分书的逻辑后就开始代码了 (未完待续...