PHP面试题目

29个成员

实际运用-退货的处理算法

发表于 2015-12-09 1520 次查看

假设用户有一个订单,

$orderItems = array(

‘ItemA’=>array(‘price’=>5.0, ‘quantity’=>2),

‘ItemB’=>array(‘price’=>20.0, ‘quantity’=>1),

);

订单中产品ItemA的单价是5.0,数量是2;产品ItemB的单价是20,数量是1;

这个订单总价是 5.0 * 2 + 20.0 * 1 = 30。

 

假设最终付款的时候,由于这个订单由于使用代金券,优惠了$discountAmount = 10.0 元的价格,用户实际支付了20元。退货的时候,每个产品的退货价格是按照付款折扣率计算的。如果用户退货需要退掉1个ItemA,那么实际退给用户的钱应该是 

(5.0 * 1) * (20.0/30.0) = 3.33 元(精确到2位小数)

 

$refundItems是实际退货的数量。在$orderItems为上述取值,$discountAmount=10的时候

样例1:$refundItems = array( array(‘ItemA’=>1) ) 表示退1个ItemA,函数返回3.33

样例2:$refundItems = array( array(‘ItemA’=>2, ‘ItemB’=>1) ) 表示全退,函数返回20.00

 

请编写能实现上述功能的函数

函数原型: function CalcRefundAmount($orderItems, $discountAmount, $refundItems)

6回复
  • 2楼 献尽人世 2015-12-09

    function CalcRefundAmount($orderItems, $discountAmount, $refundItems){
        if (!count($refundItems)) {
            return 0.00; 
        }
        // 如果没有折扣的退款金额和订单总价
        $returnWithoutDiscount = $totalAmount = 0;
        foreach ($orderItems as $key => $value) {
            if ( isset($refundItems[0][$key]) && $value['quantity'] < $refundItems[0][$key] ) {
                return false;
            }
            $totalAmount += $value['price'] * $value['quantity'];
            $returnWithoutDiscount += $value['price'] * (isset($refundItems[0][$key]) ? $refundItems[0][$key] : 0);
        }
        if ($discountAmount > 0) {
            $return = $returnWithoutDiscount * ($totalAmount - $discountAmount) / $totalAmount;
        } else {
            $return = $returnWithoutDiscount;
        }
        return sprintf("%.2f",$return);
    }

  • 3楼 福娃 2015-12-09

    //订单
    $orderItems = array(
    'ItemA'=>array('price'=>5.0, 'quantity'=>2),
    'ItemB'=>array('price'=>20.0, 'quantity'=>1),
    );

    function CalcRefundAmount($orderItems, $discountAmount, $refundItems){
        foreach($refundItems as $k=>$v){ //计算退款总额
             $tui_money+=$orderItems[$k]['price'] * $v;
        }
        foreach($orderItems as $k=>$v){ //计算订单总额(无券)
             $money+=$v['price'] * $v['quantity'];
        }
        return sprintf("%.2f", $tui_money * ($money-$discountAmount)/$money );
    }

    $discountAmount=10; //优惠券(元)
    $refundItems = array( array('ItemA'=>1),array('ItemA'=>2, 'ItemB'=>1)) ; //双订单退货
    //$refundItems = array( array('ItemA'=>1)) ; //退货单1:表示退1个ItemA,函数返回3.33
    //$refundItems = array( array('ItemA'=>2, 'ItemB'=>1) ) ; //退货单2:表示全退,函数返回20.00

    foreach($refundItems as $k=>$value){ //多订单处理
       echo "订单".($k+1)."应退:".CalcRefundAmount($orderItems, $discountAmount, $value)."<br>";
    }

  • 4楼 井底之蛙 2015-12-09

    <?php
    header("content-type:text/html;charset=utf-8");
    $orderItems = array(

    'ItemA'=>array('price'=>5.0, 'quantity'=>5),
    'ItemB'=>array('price'=>20.0, 'quantity'=>3),

    );
    //$discountAmount(电子卷优惠),$orderItems(原始购买数据),$refundItems(实际退货的数量)
    function CalcRefundAmount(&$orderItems, $discountAmount, $refundItems){
        $zongjin=0; $tui_zong=0; $i=0;    
       foreach($orderItems as $ord_key => $ord_value){
         $orderItems_key[]=$ord_key;  //获取商品名称
         foreach($orderItems[$ord_key] as $key => $value){
             $arr[]=$key;  //获取商品各类信息名:单价,数量
            }
        $zongjin=$zongjin+($ord_value[$arr[0]]*$ord_value[$arr[1]]);//商品总价值
       }
           $shizhi=$zongjin-$discountAmount; //用户实质支付金额
       foreach($refundItems as $tui_key => $tui_value){
        if($discountAmount >= ($zongjin/2)){
            echo "优惠卷必须小于总金额的一半";
            exit();}
        $bili=$shizhi/$zongjin;           //支付比例
          if( $tui_value[$arr[1]] <= $orderItems[$orderItems_key[$i]][$arr[1]]){ //退货数量和购买数量对比
            $tui_zong=$tui_zong+($tui_value[$arr[0]]*$tui_value[$arr[1]]);  //退货总价值
            $orderItems[$orderItems_key[$i]][$arr[1]]=$orderItems[$orderItems_key[$i]][$arr[1]]-$tui_value[$arr[1]]; //输入剩余商品数量,防止同一单号再次退货出现BUG
          }else{
            echo "商品:".$tui_key."退货数量大于购买数量";
            exit();
          }
       $i++;
       }
       if( $shizhi!=$tui_zong){
         $tui_shizhi=$bili*$tui_zong;
         echo $shizhi.'---'.$zongjin.'---'.$bili.'---'.$tui_shizhi.'</br>';
           foreach ($refundItems as $ref_key => $ref_value){
            echo '退货商品:'.$ref_key.'---商品单价:'.$ref_value[$arr[0]].'---退货数量:'.$ref_value[$arr[1]].'</br>';
           }
         echo "实质退货金额:".sprintf("%.2f",$tui_shizhi);//取小数点后两位
       }else{
           echo '全额退回:'.$shizhi;
       }
     }
     $ref = array(
    'ItemA'=>array('price'=>5.0, 'quantity'=>4),
    'ItemB'=>array('price'=>20.0, 'quantity'=>3),
    );
    CalcRefundAmount($orderItems,5,$ref);
    echo '</br>';
    var_dump($orderItems);  
    ?>

  • 5楼 欧阳 2015-12-09

    <?php
    function CalcRefundAmount($orderItems, $discountAmount, $refundItems){
        //如果没有退货就返回退款为零
        if (!count($refundItems)) {
            return 0.0; 
        }
        // 如果没有折扣的退款
        $returnWithoutDiscount = 0;
        $totalAmount=array();
        foreach ($orderItems as $key => $value) {
            foreach($refundItems as $k=>$v){
                if ( isset($v[$key]) && $value['quantity'] < $v[$key] ) {
                return false;      
            }  
             $returnWithoutDiscount += $value['price'] * (isset($v[$key]) ? $v[$key] : 0);
        }
            $totalAmount[] = $value['price'] * $value['quantity'];
            // 总金额
            $totalAmounts = array_sum($totalAmount);   
        }
            var_dump($totalAmounts);
            var_dump($returnWithoutDiscount);
        //有折扣的退款金额
        if ($discountAmount > 0) {
            $return = $returnWithoutDiscount * ($totalAmounts - $discountAmount) / $totalAmounts;
        } else {
            $return = $returnWithoutDiscount;
        }
        return sprintf("%.2f",$return);
    }
        $orderItems=array( 
            'item1'=>array('price'=>30,'quantity'=>2),
            'item2'=>array('price'=>45,'quantity'=>3),
        );
        //优惠券
        $discountAmount=10;
        //需退商品及数量
        $refundItems=array(array('item1'=>2),
                           array('item2'=>3));
        $result[]=CalcRefundAmount($orderItems,$discountAmount,$refundItems);
        var_dump($result);
        

  • 6楼 祝你好运 2015-12-09

    <?php
    header("content-type:text/html;charset=utf-8");
    $orderItems = array(
    'ItemA'=>array('price'=>5.0, 'quantity'=>2),
    'ItemB'=>array('price'=>20.0, 'quantity'=>1),
    );
    $refundItems = array( array('ItemA'=>1) );
    $discountAmount = 10.0 ;
    //$refundItems = array( array('ItemA'=>2, 'ItemB'=>1) );

    function CalcRefundAmount($orderItems, $discountAmount=0, $refundItems){
        
    if(!isset($refundItems)){
        return;
    }


    //计算购买总价
        $total=0;
    foreach ($orderItems as $k => $v) {    
      $total=$total+$orderItems[$k]['price']*$orderItems[$k]['quantity'];
        }    
    //计算退货总价
        $tui=0;
        $itm=array_keys($refundItems[0]) ; //获取商品名称   
    foreach ($itm as $key => $val) {
         $tui=$tui+$orderItems[$val]['price']*$refundItems[0][$val];    
    }
    //计算优惠比例$you_hui=$yh
    $yh=($total-$discountAmount)/$total;
    //计算退款金额
       if($tui==$total){
           $tui_kuan=$tui-$discountAmount;
       }else{
        $tui_kuan=$tui*$yh;}
    echo  '应退款'.round($tui_kuan ,2);
    }
    if(!isset($discountAmount)){
        $discountAmount=0;
    }
    if(isset($orderItems)&&isset($refundItems)){
        
        CalcRefundAmount($orderItems, $discountAmount, $refundItems);
    }else{
        echo '没有退货或没有此订单';
    }

    ?>

  • 7楼 祝你好运 2015-12-09

    修改了很多遍,终于完成,不知还有没有bug;

发表回复
你还没有登录,请先登录注册

加入我们吧,一起学习QQ群516033298