@
alect 我看了一下我们之前倒闭的项目里面,也是这么写的。
```php
/**
* 按照 items totals 等比例分配 amount ( amount 就是折扣总额,单位都是分)
* 返回分配过后的 amount
* @
param array $itemsTotals
* @
param int $amount
* @
return array
*/
private function distributeAmountOfItem(array $itemsTotals, int $amount)
{
$total = array_sum($itemsTotals);
$distributedAmounts = [];
// round(PHP_ROUND_HALF_DOWN) 表示 4 舍 5 入
// 所以最终 array_sum($distributedAmounts) 的值可能大于也可能小于 amount
foreach ($itemsTotals as $item) {
$distributedAmounts[] = (int) round(($item * $amount) / $total, 0, PHP_ROUND_HALF_DOWN);
}
// 余数均分, 如果 missingAmount 是负数,则每一件商品需要把多的折扣 - 回来
$missingAmount = $amount - array_sum($distributedAmounts);
for ($i = 0, $iMax = abs($missingAmount); $i < $iMax; ++$i) {
$distributedAmounts[$i] += $missingAmount >= 0 ? 1 : -1;
}
return $distributedAmounts;
}
```