天天看点

求一个PHP物流拆分包裹的算法?

现有php订单商品列表数组如下:

$goods =  [
    20200702024 =>  [
        "name" => "LP-雨伞",           // 商品名称
        "bar_code" => "20200702024",   // 条形码
        "quantity" => "3",             // 数量
        "scan_mode" => "5",            // 发货模式
        "volume" => "15.6",            // 体积
      ],
  6970328080043 =>  [
        "name" => "压缩面膜",
        "bar_code" => "6970328080043",
        "quantity" => "1",
        "scan_mode" => "5",
        "volume" => "23",            
  ],
  6922994301816 =>  [
        "name" => "洁面巾",
        "bar_code" => "6922994301816",
        "quantity" => "5",
        "scan_mode" => "3",
        "volume" => "20",
  ],
    6922994300765 =>  [
        "name" => "鲜藻精华面膜",
        "bar_code" => "6922994300765",
        "quantity" => "11",
        "scan_mode" => "4",
        "volume" => "36",
    ],
    6922994300192 =>  [
        "name" => "甘菊花露水",
        "bar_code" => "6922994300192",
        "quantity" => "8",
        "scan_mode" => "1",
        "volume" => "65",
    ],
];
           

现有包裹箱子体积固定为300,如何拆分订单商品。

拆分包裹条件:

1、最小化拆分包裹,不能浪费箱子

2、每个商品的体积是单个的,总体积= 商品数量 X 单个体积

3、商品可以随意搭配装箱,只要满足最后的条件,箱子最小化,不浪费一个箱子

4、比如:有些商品装3个就满了,但是它有8个,也要拆开放下一个箱子

5、使用PHP语言,这个算法应该如何写?

2020年11月19日09:56:28

/**
 * 分框算法第三期:2020-11-25 10:42:39
 * 按商品的体积分框,体积 X 数量
 * 贪婪算法分框打包
 * @param $items
 * @return array
 */
function soft_goods($items)
{
    if(empty($items)) return [];

    // 商品列表 items按商品体积拆分
    $box_volume_count = 200000000; // 仓库发货框的体积(立毫米)
    $box_count = 0; // 分框框的数量
    $item_count = count($items);
    $box = array();// 发货框数组

    foreach ($items as $k => $v){

        $_box_index = false;
        $_box_count = count($box);

        for ($box_index = 0; $box_index < $_box_count; $box_index++) {
            if ($box[$box_index]['volume'] + $items[$k]['volume'] <= $box_volume_count) {
                $_box_index = $box_index;
                break;
            }
        }
        if ($_box_index === false) {
            $box[$_box_count]['volume'] = $items[$k]['volume']; // 单个框累积总体积
            $box[$_box_count]['items'][] = $v;
            $box_count++;

        } else {
            $box[$_box_index]['volume'] += $items[$k]['volume'];
            $box[$_box_index]['items'][] = $v;
        }
    }

    return $box;
}
           

返回结果: