1. /**
  2. * 运费拆分.
  3. *
  4. * @param int $f
  5. * @param array $arr
  6. *
  7. * @return array
  8. */
  9. protected function freightSplit($f = 0, $arr = []): array
  10. {
  11. $count = count($arr); //总记录数
  12. $allNum = array_sum(array_column($arr, 'product_number'));
  13. //排序
  14. uksort($arr, function ($ak, $bk) use ($arr) {
  15. $a = $arr[$ak];
  16. $b = $arr[$bk];
  17. if ($a['product_number'] === $b['product_number']) {
  18. return $ak - $bk;
  19. }
  20. return $a['product_number'] > $b['product_number'] ? 1 : -1;
  21. });
  22. $i = 1;
  23. $freightCumulative = 0;
  24. foreach ($arr as &$val) {
  25. if ($count == 1) {
  26. $val['_freight_amount'] = $f;
  27. } elseif ($i == $count) {
  28. $val['_freight_amount'] = bcsub($f, $freightCumulative, 2);
  29. } else {
  30. $val['_freight_amount'] = bcmul(bcdiv($val['product_number'], $allNum, 2), $f, 2);
  31. $freightCumulative = bcadd($freightCumulative, $val['_freight_amount'], 2);
  32. }
  33. ++$i;
  34. }
  35. ksort($arr);
  36. return $arr;
  37. }