使用SimpleXMLElement和array_walk()

时间:2017-03-28 02:42:10

标签: php arrays xml converter nodes

我正在尝试使用在本网站其他地方发布的示例从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数组中的值切换密钥,但这对我来说似乎是一个懒惰的黑客。我认为这个问题存在于我array_walk_recursive的回调中,但我不确定如何让它发挥作用。我对有关将PHP数组转换为XML的更好方法的建议持开放态度。我只是尝试了这个,因为它看似简单而且没有错综复杂。 (哈哈..)

1 个答案:

答案 0 :(得分:1)

您的代码存在的问题是array_walk_recursive使用参数 value 然后 key (按此顺序)提供回调。

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

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

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

https://3v4l.org/oOHSb