如何调整PHP代码适配二维包裹数组实现托盘最优装箱
适配二维包裹数组的PHP托盘装箱实现
核心需求
- 输入为二维包裹数组,每个元素包含
[产品ID, 尺寸(cm)] - 输出为三维托盘数组,每个托盘子数组存储完整包裹数据,且托盘内所有包裹尺寸总和不超过265cm
- 采用**首次适配递减算法(FFD)**实现最优装箱,优先分配大尺寸包裹以减少托盘使用量
修改后的完整代码
<?php function packPackagesToPallets(array $packages, int $maxCapacity = 265): array { // 按包裹尺寸降序排序,优先处理大尺寸包裹 usort($packages, fn($a, $b) => $b[1] <=> $a[1]); $pallets = []; foreach ($packages as $package) { $pkgSize = $package[1]; $placed = false; // 尝试放入已有托盘 foreach ($pallets as &$pallet) { $usedCapacity = array_sum(array_column($pallet, 1)); if ($usedCapacity + $pkgSize <= $maxCapacity) { $pallet[] = $package; $placed = true; break; } } unset($pallet); // 解除引用,避免后续数组操作异常 // 所有托盘都放不下,新建托盘存储当前包裹 if (!$placed) { $pallets[] = [$package]; } } return $pallets; } // 示例调用 $testPackages = [ ['PROD001', 150], ['PROD002', 100], ['PROD003', 80], ['PROD004', 90], ['PROD005', 70], ['PROD006', 260], ]; $result = packPackagesToPallets($testPackages); // 打印结果 foreach ($result as $idx => $pallet) { echo "托盘 " . ($idx + 1) . "\n"; echo "总占用尺寸: " . array_sum(array_column($pallet, 1)) . "cm\n"; foreach ($pallet as $pkg) { echo "- 产品ID: {$pkg[0]}, 尺寸: {$pkg[1]}cm\n"; } echo "\n"; } ?>
关键修改说明
- 保留完整包裹数据:不再单独提取尺寸数组,直接对原始二维包裹数组进行排序、分配操作,确保每个托盘子数组存储完整的
[产品ID, 尺寸]数据 - 容量计算逻辑:通过
array_column($pallet, 1)提取托盘中所有包裹的尺寸字段,再求和得到已用容量,替代原有一维数组的求和逻辑 - 排序优化:使用
usort结合箭头函数对包裹按尺寸降序排序,符合最优装箱的常见策略,能有效减少托盘使用数量 - 引用处理:遍历托盘时使用引用修改当前托盘内容,遍历结束后解除引用,避免后续数组操作出现意外覆盖问题
可选优化方向
- 若需要更优的装箱效率,可将首次适配改为最优适配(BFD):遍历所有托盘,选择剩余容量与包裹尺寸最匹配的托盘放入
- 增加参数校验:提前过滤尺寸超过托盘最大容量的包裹,避免出现无法分配的异常情况
内容的提问来源于stack exchange,提问作者Sabino Sibillano
相关产品推荐
相关产品推荐

