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

PHP中用SimpleXML转数组为XML:实现重复<shirt>子节点

解决PHP数组生成多个同名 XML子节点的问题

我明白你的问题了——你现在用数字索引$x填充数组,导致XML生成的是数字命名的子节点,但你想要多个同名的<shirt>节点,而且不想直接操作SimpleXML,只想通过调整数组结构来实现。这其实是PHP数组与XML结构映射的典型问题,我来给你讲清楚怎么修改:

问题根源

你原来的代码用$item[items][$x][color]这种数字索引的方式,生成的数组结构是:

$item = [
    'items' => [
        0 => ['color' => 'red', 'size' => 'M'],
        1 => ['color' => 'blue', 'size' => 'L']
    ]
];

XML生成器会把数字键直接作为节点名,所以输出的是<0>、<1>这类节点,不符合你的需求。

正确的数组结构调整

要生成多个<shirt>节点,你需要让items下的shirt成为一个索引数组,每个元素是包含color和size的关联数组。这样XML生成器会自动把索引数组的每个元素渲染成同名的<shirt>子节点,不会出现覆盖问题。

修改后的代码示例

  1. 先初始化正确的数组结构:
// 初始化数组,确保shirt是一个空索引数组
$item = [
    'items' => [
        'shirt' => []
    ]
];
  1. 在循环中填充数据(不再需要计数器$x):
// 假设这是你的循环逻辑,每次获取$getColor和$getSize
foreach ($yourData as $data) {
    $getColor = $data['color'];
    $getSize = $data['size'];
    
    // 直接往shirt数组中追加新元素,不会覆盖
    $item['items']['shirt'][] = [
        'color' => $getColor,
        'size' => $getSize
    ];
}

生成的数组与XML效果

修改后生成的数组结构是:

$item = [
    'items' => [
        'shirt' => [
            ['color' => 'red', 'size' => 'M'],
            ['color' => 'blue', 'size' => 'L']
        ]
    ]
];

对应的XML输出会是你想要的结构:

<items>
    <shirt>
        <color>red</color>
        <size>M</size>
    </shirt>
    <shirt>
        <color>blue</color>
        <size>L</size>
    </shirt>
</items>

关键原理

PHP数组转XML时,关联数组的键会成为节点名,而索引数组的每个元素会生成一个同名的子节点。我们就是利用这个特性,把shirt设为一个索引数组,让每个元素对应一个<shirt>节点,完美解决了数据覆盖和节点命名的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:31:19