现有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;
}
返回结果: