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

PHP XMLWriter递归处理数组:如何保持节点与数据顺序一致?

PHP XMLWriter递归生成XML节点顺序不符的解决办法

我们使用以下虚拟数组结构来讨论问题:

$data = [
  'lvl1' => [
    'lvl2' => [
      'lvl3' => 'data3'
    ],
    'val2' => 'data2'
  ]
];

当前使用PHP的XMLWriter类在内存中创建XML文档的代码:

$xml = new XMLWriter();
$xml->openMemory();
$xml->startDocument();
$xml->startElement('p');
$xml->text("Test");
$xml->endElement();
recursiveNodes($data, $xml);
$xml->endDocument();
print($xml->outputMemory());

现有的递归处理函数:

function recursiveNodes(array $data, XMLWriter $xml) : XMLWriter
{
  foreach ($data as $node) {
    if (is_array($node)) {
      recursiveNodes($node, $xml);
    } else {
      $xml->writeElement($node);
    }
  }
  return $xml;
}

问题:希望在<p>节点后按数组的层级顺序添加子节点,但当前递归函数会优先添加最深层的节点,不符合数组呈现的顺序要求。


修改后的递归函数

问题根源在于原函数没有处理数组的键名,也没有为子数组创建对应的父元素标签。修改后需要同时遍历键与值,遇到数组时先创建以键名为标签的元素,再递归处理子内容,以此保证节点顺序与数组结构一致:

function recursiveNodes(array $data, XMLWriter $xml): XMLWriter
{
    foreach ($data as $key => $value) {
        if (is_array($value)) {
            $xml->startElement($key);
            recursiveNodes($value, $xml);
            $xml->endElement();
        } else {
            $xml->writeElement($key, $value);
        }
    }
    return $xml;
}

生成的XML效果

修改后运行代码,输出的XML结构如下:

<?xml version="1.0"?>
<p>Test</p>
<lvl1>
  <lvl2>
    <lvl3>data3</lvl3>
  </lvl2>
  <val2>data2</val2>
</lvl1>

该结构完全匹配原数组的层级与顺序:lvl1作为根级元素,内部先出现lvl2子元素(包含lvl3),再出现val2元素,和数组的呈现顺序一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 14:32:17