1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| /** * 最大余额法 * @param array $data * @return array */
function MaxBalance($data) { $sum = array_sum($data); $res = []; foreach ($data as $key=>$item) { $res[$key]['percent'] = ($item/$sum)*10000; } //取出小数点 $result = []; foreach ($res as $key=>$value) { // $tmp = explode('.', $value['percent']); $result[$value['percent']]['percent'] = $value['percent']; $tmp = explode('.', $value['percent']); $result[$value['percent']]['point'] = $tmp[1]; $result[$value['percent']]['int'] = $tmp[0]; } //小数点排序 $sort = array_column($result, 'point'); array_multisort($sort, SORT_DESC, $result); $int = array_column($result,'int'); $intSum = array_sum($int); $count = 10000 - $intSum; //余额排序分配席位 foreach ($result as $key=>$value) { if($key < $count){ $result[$key]['int'] = ($result[$key]['int'] + 1)/100; } else { $result[$key]['int'] = $result[$key]['int']/100; }
} } var_dump(MaxBalance([2,3,4]));
|