一、场景
把订单的金额按照数量拆成
number
个订单详情,如果金额是10
,数量是3
,则拆出来的单个金额就是3.33
,就会丢失0.01
。为了解决这一问题,我们需要对比订单详情总金额与订单金额,如果不一致,则调整最后一个
订单详情的金额(增加或减少),使金额保持一致。
二、代码
//订单拆单:把单个订单拆成number个订单详情,订单详情总额不等于订单金额时,调整最后一个订单详情金额
public function test() {
//订单数据
$orderData = [
['id' => 1, 'name' => '数据1', 'number' => 2, 'price' => 10.12], //单条订单数据
['id' => 2, 'name' => '数据2', 'number' => 3, 'price' => 10.13],
['id' => 3, 'name' => '数据3', 'number' => 6, 'price' => 10.10],
];
$detailData = [];
foreach ($orderData as $value) {
$price = $value['price'];
$number = $value['number'];
$tempData = [];
for ($i = 0; $i < $number; $i ++) { //把单个订单拆成number个订单详情
$tempData[] = [
'pid' => $value['id'],
'name' => "{$value['name']}的详情数据",
'price' => ($number > 0) ? sprintf('%.2f', $price / $number) : 0 //订单详情的价格,并保留2位小数
];
}
//金额对不上时调整
self::comparePrice($tempData, $price);
$detailData = array_merge($detailData, $tempData); //把单个订单的详情数据追加到总详情数据中
}
var_export($detailData); //打印结果数据
}
/**
* 校验单个订单详情数据的总金额和订单金额是否一致。如果不一致则:调整最后一条的价格
* @param array $tempData 单个订单拆出的详情数据
* @param string $price 单个订单的金额
* @param string $priceField 详情数据的金额字段名
*/
public function comparePrice(&$tempData, $price, $priceField = 'price') {
$detailTotalPrice = array_sum(array_column($tempData, $priceField)); //订单详情的总金额
if ($detailTotalPrice != $price) { //订单详情的总金额 不等于 订单金额
$maxIndex = count($tempData) - 1; //最后一条数据的索引
$maxIndexPrice = $tempData[$maxIndex][$priceField]; //最后一条数据的金额
$maxIndexNewPrice = sprintf('%.2f', $price - ($detailTotalPrice - $maxIndexPrice)); //根据差额计算最后一条数据的金额
$tempData[$maxIndex][$priceField] = $maxIndexNewPrice; //给最后一条数据的金额赋值
}
}
三、打印
array (
0 =>
array (
'pid' => 1,
'name' => '数据1的详情数据',
'price' => '5.06',
),
1 =>
array (
'pid' => 1,
'name' => '数据1的详情数据',
'price' => '5.06',
),
2 =>
array (
'pid' => 2,
'name' => '数据2的详情数据',
'price' => '3.38',
),
3 =>
array (
'pid' => 2,
'name' => '数据2的详情数据',
'price' => '3.38',
),
4 =>
array (
'pid' => 2,
'name' => '数据2的详情数据',
'price' => '3.37',
),
5 =>
array (
'pid' => 3,
'name' => '数据3的详情数据',
'price' => '1.68',
),
6 =>
array (
'pid' => 3,
'name' => '数据3的详情数据',
'price' => '1.68',
),
7 =>
array (
'pid' => 3,
'name' => '数据3的详情数据',
'price' => '1.68',
),
8 =>
array (
'pid' => 3,
'name' => '数据3的详情数据',
'price' => '1.68',
),
9 =>
array (
'pid' => 3,
'name' => '数据3的详情数据',
'price' => '1.68',
),
10 =>
array (
'pid' => 3,
'name' => '数据3的详情数据',
'price' => '1.70',
),
)