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>子节点,不会出现覆盖问题。
修改后的代码示例
- 先初始化正确的数组结构:
// 初始化数组,确保shirt是一个空索引数组 $item = [ 'items' => [ 'shirt' => [] ] ];
- 在循环中填充数据(不再需要计数器
$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
相关产品推荐
相关产品推荐

