我们用这个虚拟结构来讨论一下问题:
$data = [
'lvl1' => [
'lvl2' => [
'lvl3' => 'data3'
],
'val2' => 'data2'
]
];
我正在使用 PHP XMLWriter 类在内存中创建文档:
$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;
}
现在,在我的代码中,我想使用一些递归函数,在“
”节点之后添加节点。
由于递归调用的性质,最后一个(最深的)节点将首先添加到 XML 结构中,但其顺序应与数据出现的顺序相同。
XMLWriter 是按顺序写入的,递归地使用它的协议需要将其与 XML 文档结构对齐。
例如当调用
writeElement()
时,它会写入一个元素,即叶节点。
当调用
startElement()
... endElement()
时,它将写入一个父节点。
当您想使用递归函数通过递归遍历来装饰
$data
结构时,您的例程只有叶节点部分:
if (is_array($node)) {
recursiveNodes($node, $xml);
} else {
$xml->writeElement($node);
}
因此父节点丢失。从你的问题中我并不完全清楚,但也许从密钥中将其包装为
$data
可能已经足够了:
foreach ($data as $node => $children) {
$xml->startElement($node);
if (is_array($children)) {
...
}
$xml->endElement();
}
备注:
$node
现在是 key,之前同一个变量名下的 value 现在是 $children
变量。