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

PHP中使用SimpleXMLElement与array_walk_recursive为何出现键值反转?

解决array_walk_recursive生成XML时键值反转的问题

哦,这个坑我之前踩过!你遇到的键值反转问题,核心原因是array_walk_recursive的回调参数顺序和SimpleXMLElement::addChild的参数要求完全相反。

咱们来拆解一下:

  • array_walk_recursive 遍历数组时,传给回调函数的参数顺序是:数组值在前,数组键在后(也就是function($value, $key)的形式)
  • 而SimpleXMLElement::addChild 要求的参数顺序是:元素名称在前,元素值在后(也就是addChild($elementName, $elementValue)的形式)

你直接把[$xml, 'addChild']作为回调传给array_walk_recursive,相当于把数组值当成了元素名,数组键当成了元素值,自然就出现了反转的情况。

修正后的代码

只需要用一个匿名函数调换参数顺序即可:

$root = 'Auth';
$auth['user'] = 'JohnSmith';
$auth['password'] = 'somePassword';
$xml = new SimpleXMLElement("<${root}/>");

// 用匿名函数重新映射参数顺序
array_walk_recursive($auth, function($value, $key) use ($xml) {
    $xml->addChild($key, $value);
});

echo $xml->asXml();

正确输出

运行后你会得到预期的XML:

<?xml version="1.0"?>
<Auth>
  <user>JohnSmith</user>
  <password>somePassword</password>
</Auth>

至于你说有些资源用类似写法却没提这个问题,大概率是那些示例里的数组结构是反过来的(比如把元素值作为键,元素名作为值),或者是作者没注意到这个细节——毕竟如果数组结构刚好匹配错误的参数顺序,结果看起来也“正常”,但换个正常的键值对就出问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:06:05