Преобразование массива array в XML (Array to XML PHP)
Бывает, что приходится отойти от формата json в сторону XML, однако простой функции, наподобии json_encode для подобных манипуляций с XML пока нет.
На stackoverflow нашел замечательную функцию, которая работает с вложенными массивами.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <?php header('Content-Type: text/xml; charset-utf-8'); $array = array('test' => 'test1', array(1, 2)); // создаем объект SimpleXMLElement $xml = new SimpleXMLElement("<?xml version=\"1.0\"?-->"); // используем функцию преобразования array_to_xml($array,$xml); //Выводим сгенерированный XML echo $xml->asXML(); // сама функция преобразования function array_to_xml($array, &$xml) { foreach($array as $key => $value) { if(is_array($value)) { //если элемент число, то добавляем префикс, с цифр не может начинаться if(!is_numeric($key)) { $subnode = $xml->addChild("$key"); array_to_xml($value, $subnode); } else { $subnode = $xml->addChild("item$key"); array_to_xml($value, $subnode); } } else { if(!is_numeric($key)) { $xml->addChild("$key","$value"); } else { $xml->addChild("item$key","$value"); } } } } ?> |
И результат выполнения:
1 2 3 4 5 | <root> <test>test1</test> <item0>1</item0> <item1>2</item1> </root> |
UPD 20.02.2015
Предложен упрощенный вариант в комментариях, спасибо Szen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | function xml_encode ($array, $node = null) { if (!isset($node)) $node = new SimpleXMLElement("<!--?xml version=\"1.0\"?-->"); foreach ($array as $key => $value) { if (is_numeric($key)) $key = 'item' . $key; if (is_array($value)) { $subnode = $node->addChild($key); $node = $this->xml_encode($array, $subnode); } else { $node->addChild($key, $value); } } return $node->asXML(); } |
Комментарии к Преобразование массива array в XML (Array to XML PHP) (3)
Szen
я бы немного упростил и оптимизировал код:
function xml_encode ($array, $node = null) {
if (!isset($node)) $node = new SimpleXMLElement(»);
foreach ($array as $key => $value) {
if (is_numeric($key)) $key = ‘item’ . $key;
if (is_array($value)) {
$subnode = $node->addChild($key);
$node = $this->xml_encode($array, $subnode);
} else {
$node->addChild($key, $value);
}
}
return $node->asXML();
}
Antu Antu
Какие-то блоки item не понятно зачем они гораздо проще.
$xml_data = new SimpleXMLElement('');
function to_xml(&$object, $data) {
foreach($data as $key => $value) {
if(is_array($value)) {
if(!is_numeric($key)){
$subnode = $object->addChild("$key");
self::to_xml($subnode,$value);
}
else{
self::to_xml($object,$value);
}
}
else {
$object->addChild("$key","$value");
}
}
}
$result = $xml_data->asXML();
Antu Antu
Какие-то блоки item не понятно зачем они гораздо проще.
$xml_data = new SimpleXMLElement(»);
function to_xml(&$object, $data) {
foreach($data as $key => $value) {
if(is_array($value)) {
if(!is_numeric($key)){
$subnode = $object->addChild(«$key»);
self::to_xml($subnode,$value);
}
else{
self::to_xml($object,$value);
}
}
else {
$object->addChild(«$key»,»$value»);
}
}
}
$result = $xml_data->asXML();