You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整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";
}
?>

关键修改说明

  1. 保留完整包裹数据:不再单独提取尺寸数组,直接对原始二维包裹数组进行排序、分配操作,确保每个托盘子数组存储完整的[产品ID, 尺寸]数据
  2. 容量计算逻辑:通过array_column($pallet, 1)提取托盘中所有包裹的尺寸字段,再求和得到已用容量,替代原有一维数组的求和逻辑
  3. 排序优化:使用usort结合箭头函数对包裹按尺寸降序排序,符合最优装箱的常见策略,能有效减少托盘使用数量
  4. 引用处理:遍历托盘时使用引用修改当前托盘内容,遍历结束后解除引用,避免后续数组操作出现意外覆盖问题

可选优化方向

  • 若需要更优的装箱效率,可将首次适配改为最优适配(BFD):遍历所有托盘,选择剩余容量与包裹尺寸最匹配的托盘放入
  • 增加参数校验:提前过滤尺寸超过托盘最大容量的包裹,避免出现无法分配的异常情况

内容的提问来源于stack exchange,提问作者Sabino Sibillano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:30:46