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
相关产品推荐
相关产品推荐

