把订单的金额按照数量拆成
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', ), )