XML 节点和值使用 SimpleXMLElement 和 array_walk() 反转

XML node and values reversed using SimpleXMLElement and array_walk()

我正在尝试使用本网站其他地方发布的示例从 PHP 中的数组构建一个 XML 元素。 XML 字符串正在按预期创建,但节点及其值是相反的。例如:

$params = array(
        "email" => 'me@gmail.com'
        ,"pass" => '123456'
        ,"pass-conf" => '123456'
    );
    $xml = new SimpleXMLElement('<root/>');
    array_walk_recursive($params, array($xml, 'addChild'));
    echo $xml->asXML();

现在我期待返回的是:

<?xml version="1.0"?>
  <root>
    <email>me@gmail.com</email>
    <pass>123456</pass>
    <pass-conf>123456</pass-conf>
  </root>

但是,我不断得到的是节点名称作为值和值作为节点名称:

<?xml version="1.0"?>
  <root>
    <me@gmail.com>email</me@gmail.com>
    <123456>pass</123456>
    <123456>pass-conf</123456>
  </root>

我已经测试过用 $params 数组中的值切换密钥,但这对我来说似乎是一个懒惰的 hack。我认为问题出在我在 array_walk_recursive 中的回调中,但我不确定如何让它发挥作用。我愿意接受有关将 PHP 数组转换为 XML 的更好方法的建议。我只是试过这个,因为它看起来简单而不复杂。 (哈哈..)

您的代码的问题是 array_walk_recursive 为回调提供参数 value 然后 key (按此顺序).

SimpleXMLElement::addChild 接受参数 name 然后 value (按顺序)。


这是一个不太复杂的解决方案

foreach ($params as $key => $value) {
    $xml->addChild($key, $value);
}

https://3v4l.org/oOHSb