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

PHP中Switch Case更新数组元素失效问题求助

问题:FedEx/UPS运单API集成中包裹value字段未写入payload

我正在为一家小企业开发FedEx/UPS运单标签生成器的API集成。我更熟悉Python,因此在PHP开发中遇到了一些障碍,这是目前唯一未解决的问题。

对于多包裹的运单,每个包裹需要单独设置value、length、width、height和weight字段,同时运单还需统计总value。我用Switch Case来统计总value(数据以企业特定的物品代码传递),这部分运行正常,但尝试用相同的Switch Case更新API调用的payload时却失效了。

当前代码:

for ($j=1; $j<=$_POST['package_count']; $j++) {
        $payload['package'.$j] = [];
        switch ($_POST['insurance'.$j]) {
        case '572':
            $value += 100;
            $payload['package'.$j]['value'] = 100;
            break;
        case '248':
            $value += 500;
            $payload['package'.$j]['value'] = 500;
            break;
        case '544':
            $value += 1000;
            $payload['package'.$j]['value'] = 1000;
            break;
        case '569':
            $value += 1500;
                    $payload['package'.$j]['value'] = 1500;
            break;
        case '570':
            $value += 2000;
            $payload['package'.$j]['value'] = 2000;
            break;
        case '571':
            $value += 2500;
            $payload['package'.$j]['value'] = 2500;
            break;
    }
    $totalWeight += $_POST['weight'.$j];
    $payload['package'.$j] = ['weight' => $_POST['weight'.$j], 'length' => $_POST['length'.$j], 'width' => $_POST['width'.$j], 'height' => $_POST['height'.$j]];
}
echo print_r($payload);

输出结果:

$value的更新正常,但输出payload时,包裹数组如下:

[package1] => Array
        (
            [weight] => 1
            [length] => 2
            [width] => 3
            [height] => 2
        )

[package2] => Array
        (
            [weight] => 1
            [length] => 2
            [width] => 3
            [height] => 2
        )

请问为何payload的packageJ子数组中没有被添加value字段?


原因与解决方案

问题根源

你在switch语句中已经给$payload['package'.$j]['value']赋值,但在switch之后,又执行了:

$payload['package'.$j] = ['weight' => $_POST['weight'.$j], ...];

这行代码直接覆盖了整个package$j数组,之前设置的value字段被完全替换掉了,所以最终的payload里看不到value。

修复方案

有两种可行的修复方式:

  1. 先初始化基础字段,再添加value
    把包裹的基础字段赋值放在switch之前,之后直接给数组追加value键,避免覆盖:

    for ($j=1; $j<=$_POST['package_count']; $j++) {
        // 先初始化包裹的基础字段
        $payload['package'.$j] = [
            'weight' => $_POST['weight'.$j],
            'length' => $_POST['length'.$j],
            'width' => $_POST['width'.$j],
            'height' => $_POST['height'.$j]
        ];
        // 再设置value字段
        switch ($_POST['insurance'.$j]) {
            case '572':
                $value += 100;
                $payload['package'.$j]['value'] = 100;
                break;
            case '248':
                $value += 500;
                $payload['package'.$j]['value'] = 500;
                break;
            case '544':
                $value += 1000;
                $payload['package'.$j]['value'] = 1000;
                break;
            case '569':
                $value += 1500;
                $payload['package'.$j]['value'] = 1500;
                break;
            case '570':
                $value += 2000;
                $payload['package'.$j]['value'] = 2000;
                break;
            case '571':
                $value += 2500;
                $payload['package'.$j]['value'] = 2500;
                break;
        }
        $totalWeight += $_POST['weight'.$j];
    }
    echo print_r($payload);
    
  2. 用数组合并保留value字段
    如果要维持原代码的执行顺序,可以用array_merge将包含value的原数组和基础字段数组合并:

    for ($j=1; $j<=$_POST['package_count']; $j++) {
        $payload['package'.$j] = [];
        switch ($_POST['insurance'.$j]) {
            // 原switch代码不变
        }
        $totalWeight += $_POST['weight'.$j];
        // 合并数组,保留已设置的value
        $payload['package'.$j] = array_merge(
            $payload['package'.$j],
            ['weight' => $_POST['weight'.$j], 'length' => $_POST['length'.$j], 'width' => $_POST['width'.$j], 'height' => $_POST['height'.$j]]
        );
    }
    echo print_r($payload);
    

第一种方式逻辑更清晰,推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:07:07