订单拆分成子订单问题求教

1.现在我有一个订单,已经处理成了这样一个数组:[detail=[[goods1],[goods2]...],total=[]...]

2.我的商品详情都在detail里面.其中有三个字段分别是store_id,send_way,goods_price

3.拆单规则:先根据store_id拆成一个子订单,如果其中send_way不同,则又拆出来成为一个子订单,如果其中一个子订单的商品价格总和超过了2000则再次拆分出来成为一个子订单.

4.我最后想得到的订单数组格式:[总订单=[[子订单1],[子订单2]...],total=[]...]

测试数据:

$goods_detail = [
            ["goods_name"=> "商品1", "store_id"=> "1", "goods_send_way"=> "1", "goods_total_price"=> "1000.00" ],
            ["goods_name"=> "商品2", "store_id"=> "1", "goods_send_way"=> "2", "goods_total_price"=> "1000.00" ],
            ["goods_name"=> "商品3", "store_id"=> "2", "goods_send_way"=> "2", "goods_total_price"=> "1500.00" ],
            ["goods_name"=> "商品4", "store_id"=> "2", "goods_send_way"=> "1", "goods_total_price"=> "2000.00" ],
            ["goods_name"=> "商品5", "store_id"=> "3", "goods_send_way"=> "2", "goods_total_price"=> "1000.00" ],
            ["goods_name"=> "商品6", "store_id"=> "3", "goods_send_way"=> "2", "goods_total_price"=> "500.00" ],
        ];

我现在做到根据store_id拆出来了,但是接下来根据send_way和goods_price不知道该怎么拆了,求指教

$store_id_arr = array_unique(array_column($goods_detail,'store_id'));
$store = [];
foreach ($goods_detail as $key => $value){
    foreach ($store_id_arr as $store_id_val){
        if($value['store_id'] == $store_id_val){
            $store['store'.$store_id_val][] = $value;
        }
    }
}
阅读 5.9k
2 个回答

题主我弄了一下午弄出来了QAQ好心塞


public function SplitOrder($goods_detail){
        $store_id_arr = array_unique(array_column($goods_detail,'store_id'));
        $goods_send = array_unique(array_column($goods_detail,'goods_send_way'));
        $store = [];
        $way = [];
        $data = [];
        $result = [];

        //根据店铺id
        foreach ($goods_detail as $value){
            foreach ($store_id_arr as $store_id_val){
                if($value['store_id'] == $store_id_val){
                    $store['store'.$store_id_val][] = $value;
                }
            }
        }

        //根据运送方式
        foreach ($store as $key => $value){
            foreach ($value as $v){
                foreach ($goods_send as $s){
                    if($v['goods_send_way'] == $s){
                        $way[$key]['way'.$s][] = $v;
                    }
                }
            }
        }

        //降维
        foreach ($way as $value){
            foreach ($value as $v){
                $data[] = $v;
            }
        }

        $j = 0;
        //根据订单金额来拆分订单
        foreach ($data as $key => $value){
            //对子订单中根据一件商品总价排序
            $sort = array(
                'direction' => 'SORT_ASC', //排序顺序标志 SORT_DESC 降序;SORT_ASC 升序
                'field'     => 'goods_total_price',       //排序字段
            );
            $arrSort = array();
            foreach($value AS $uniqid => $row){
                foreach($row AS $k=>$v){
                    $arrSort[$k][$uniqid] = $v;
                }
            }
            if($sort['direction']){
                array_multisort($arrSort[$sort['field']], constant($sort['direction']), $value);
            }

            //总和大于2000另创子订单
            $sum = 0;
            foreach ($value as $v){
                $sum += $v['goods_total_price'];
                if($sum <= 2000){
                    $result[$j][] = $v;
                }else{
                    $j++;
                    $result[$j] = $v;
                }
            }
            $j++;
        }
        return $result;
    }
    
    更详细的方法题主记成了笔记:https://segmentfault.com/n/1330000008707011
 $goods_detail = array(
           array("goods_name"=> "商品1", "store_id"=> "1", "goods_send_way"=> "1", "goods_total_price"=> "1000.00" ),
           array("goods_name"=> "商品2", "store_id"=> "1", "goods_send_way"=> "2", "goods_total_price"=> "1000.00"),
           array("goods_name"=> "商品3", "store_id"=> "2", "goods_send_way"=> "2", "goods_total_price"=> "1500.00"),
           array("goods_name"=> "商品4", "store_id"=> "2", "goods_send_way"=> "1", "goods_total_price"=> "2000.00" ),
           array("goods_name"=> "商品5", "store_id"=> "3", "goods_send_way"=> "2", "goods_total_price"=> "1000.00" ),
           array("goods_name"=> "商品6", "store_id"=> "3", "goods_send_way"=> "2", "goods_total_price"=> "500.00" ),
        );
        foreach ($goods_detail as $key => $value) {
            $arr[$value['store_id']][$value['goods_send_way']]['data']=$value;
            $arr[$value['store_id']][$value['goods_send_way']]['total'] +=$value['goods_total_price'];

        }

        foreach ($arr as $k1 => $v1) {
            foreach ($v1 as $k2 => $v2) {
                if($v2['total']>2000){
                    //拆单,可以写一个算法,2000为基数,7000就拆4单,封装一个方法
                   
                }else{
                    //合成一个订单

                }
                
            }
        }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题