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。
修复方案
有两种可行的修复方式:
先初始化基础字段,再添加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);用数组合并保留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
相关产品推荐
相关产品推荐

