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

PHP数组转XML问题:NumberOfUnits标签重复生成修正求助

解决PHP数组生成XML时重复NumberOfUnits节点的问题

我帮你搞定这个问题啦!你遇到的核心问题是数组结构设计不对,导致XML生成工具把每个NumberOfUnit都单独包裹在了NumberOfUnits节点里,而不是把所有NumberOfUnit放在同一个NumberOfUnits节点下。

错误原因分析

你之前的写法是每次往NumberOfUnits数组里新增一个包含NumberOfUnit的子数组:

$new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits'][]['NumberOfUnit'] = array('8.00');
$new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits'][]['NumberOfUnit'] = array('9.00');

这种结构会被XML生成器解析为多个独立的NumberOfUnits节点,每个节点下只有一个NumberOfUnit。

修正后的数组代码

正确的做法是让NumberOfUnits成为一个包含NumberOfUnit数组的节点,所有的数值都放在这个NumberOfUnit数组里:

$new_timesheet = array();
$new_timesheet['Timesheet'] = array();
$new_timesheet['Timesheet']['EmployeeID'] = '8534e85a-e398-4041-99b1-cce51e7a8a02';
$new_timesheet['Timesheet']['StartDate'] = "2018-01-22";
$new_timesheet['Timesheet']['EndDate'] = "2018-01-28";
$new_timesheet['Timesheet']['Status'] = "Draft";
// 注意:预期XML里没有Hours字段,如果不需要可以删掉这一行
// $new_timesheet['Timesheet']['Hours'] = "5.0";
$new_timesheet['Timesheet']['TimesheetLines'] = array();
$new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine'] = array();
$new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['EarningsRateID'] = '0daff504-2d42-4243-bdac-24f2bae0ce7c';

// 初始化NumberOfUnits节点,里面包含一个NumberOfUnit数组
$new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits'] = array(
    'NumberOfUnit' => array()
);

// 逐个添加NumberOfUnit的值
$new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits']['NumberOfUnit'][] = '8.00';
$new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits']['NumberOfUnit'][] = '9.00';
$new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits']['NumberOfUnit'][] = '8.00';
$new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits']['NumberOfUnit'][] = '8.00';
$new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits']['NumberOfUnit'][] = '8.00';
$new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits']['NumberOfUnit'][] = '0.00';
$new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits']['NumberOfUnit'][] = '0.00';

如果你想一次性赋值所有NumberOfUnit,也可以简化成这样:

$new_timesheet['Timesheet']['TimesheetLines']['TimesheetLine']['NumberOfUnits']['NumberOfUnit'] = array(
    '8.00', '9.00', '8.00', '8.00', '8.00', '0.00', '0.00'
);

修正后生成的XML效果

这样调整后,生成的XML就会符合你的预期:

<Timesheets>
  <Timesheet>
    <EmployeeID>8534e85a-e398-4041-99b1-cce51e7a8a02</EmployeeID>
    <StartDate>2018-01-22</StartDate>
    <EndDate>2018-01-28</EndDate>
    <Status>Draft</Status>
    <TimesheetLines>
      <TimesheetLine>
        <EarningsRateID>0daff504-2d42-4243-bdac-24f2bae0ce7c</EarningsRateID>
        <NumberOfUnits>
          <NumberOfUnit>8.00</NumberOfUnit>
          <NumberOfUnit>9.00</NumberOfUnit>
          <NumberOfUnit>8.00</NumberOfUnit>
          <NumberOfUnit>8.00</NumberOfUnit>
          <NumberOfUnit>8.00</NumberOfUnit>
          <NumberOfUnit>0.00</NumberOfUnit>
          <NumberOfUnit>0.00</NumberOfUnit>
        </NumberOfUnits>
      </TimesheetLine>
    </TimesheetLines>
  </Timesheet>
</Timesheets>

原理很简单:XML生成工具会把数组的键映射为XML节点名,当你给NumberOfUnits设置一个包含NumberOfUnit数组的值时,它就会生成一个NumberOfUnits父节点,里面包含所有NumberOfUnit子节点,而不是重复创建NumberOfUnits节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:48:08