如果节点名称相同,则PHP XML编写器不生成XML

如果节点名称相同,则PHP XML编写器不生成XML,php,xml,parsing,Php,Xml,Parsing,我正在尝试从关联数组生成xml数据 我的数组是 $data = array( 'item' => array( 'id' => '1', 'name' => 'bar1', 'price' => '10', 'description' => '', 'image_link_small' => '', 'image_link_big' => ''

我正在尝试从关联数组生成xml数据

我的数组是

$data = array(
    'item' => array(
        'id' => '1',
        'name' => 'bar1',
        'price' => '10',
        'description' => '',
        'image_link_small' => '',
        'image_link_big' => ''
    ),
    'item' => array(
        'id' => '2',
        'name' => 'bar2',
        'price' => '20',
        'description' => '',
        'image_link_small' => '',
        'image_link_big' => ''
    ),
    'item' => array(
        'id' => '3',
        'name' => 'bar3',
        'price' => '30',
        'description' => '',
        'image_link_small' => '',
        'image_link_big' => ''
    ),
    'item' => array(
        'id' => '4',
        'name' => 'bar4',
        'price' => '40',
        'description' => '',
        'image_link_small' => 'link1',
        'image_link_big' => 'link2'
    )
);
我的php数组到xml转换器代码是

public function convertArrayToXML($data, $rootElement = 'root', $startDoc = '1.0', $xml_encoding = 'UTF-8') {
        $xml = new XmlWriter();
        $xml->openMemory();
        $xml->startDocument($startDoc, $xml_encoding);
        $xml->startElement($rootElement);

        function write(XMLWriter $xml, $data) {
            foreach ($data as $key => $value) {
                if (is_array($value)) {
                    $xml->startElement($key);
                    write($xml, $value);
                    $xml->endElement();
                    continue;
                }
                $xml->writeElement($key, $value);
            }
        }

        write($xml, $data);

        $xml->endElement();
        return $xml->outputMemory(true);
    }
但它只给我最后一个节点的输出xml

<root>
<item>
<id>4</id>
<name>bar4</name>
<price>40</price>
<description/>
<image_link_small>link1</image_link_small>
<image_link_big>link2</image_link_big>
</item>
</root>

4.
bar4
40
链接1
链接2
如果我将数组中的更改为项1、项2、项3、项4,它将给我 正确的xml数据。有什么问题吗


谢谢

这不是XML编写器的问题。试一试

var_dump($data)


你会发现问题所在。在PHP数组中不能多次使用同一个键。

$data
数组中,键值是相同的,这就是前三个值被最后一个值覆盖的原因。请尝试以下操作:

$data = array(
  'item1' => array(.....),
  'item2' => array(.....),
  'item2' => array(.....)
)

那么如何在xml数据中实现多个项节点呢?向数组中添加另一个“维度:
item'=>array(array(id=>2,…)、array(id=>3,…)
或者,如果您知道此数组只有项,只需重命名数组:$items=>array(array('id'=>1…)转换为XML的过程正是它对您提供的数据应该做的。尝试在定义数组后立即转储它。您会发现每个元素都覆盖了它前面的元素,因为每个元素都有相同的名称,只留下最后一个元素。