Задача проста: конвертировать php массив любой вложенности в xml документ. Готового решения в самом языке так и не обнаружил. Есть функции которые конвертируют из массива в JSON и обратно, а вот в XML нет. Я конечно заядлый велосипедостроитель, но был не тот случай - время поджимало а проект надо было завершать. Ну что же немного поискав на просторах сети нашел нужное решение
class ArrayToXML
{
/**
* Функция конвертации массива в XML объект
* На вход подается мульти вложенный массив, на выходе получается с помощью рекурсии валидный xml
*
* @param array $data
* @param string $rootNodeName - корень вашего xml.
* @param SimpleXMLElement $xml - используется рекурсивно
* @return string XML
*/
public static function toXml($data, $rootNodeName = 'data', $xml=null)
{
// включить режим совместимости, не совсем понял зачем это но лучше делать
if (ini_get('zend.ze1_compatibility_mode') == 1)
{
ini_set ('zend.ze1_compatibility_mode', 0);
}
if ($xml == null)
{
$xml = simplexml_load_string("<?xml version=\"1.0\" encoding=\"utf-8\"?><$rootNodeName />");
}
//цикл перебора массива
foreach($data as $key => $value)
{
// нельзя применять числовое название полей в XML
if (is_numeric($key))
{
// поэтому делаем их строковыми
$key = "unknownNode_". (string) $key;
}
// удаляем не латинские символы
$key = preg_replace('/[^a-z0-9]/i', '', $key);
// если значение массива также является массивом то вызываем себя рекурсивно
if (is_array($value))
{
$node = $xml->addChild($key);
// рекурсивный вызов
ArrayToXML::toXml($value, $rootNodeName, $node);
}
else
{
// добавляем один узел
$value = htmlentities($value);
$xml->addChild($key,$value);
}
}
// возвратим обратно в виде строки или просто XML-объект
return $xml->asXML();
}
}
Использовать это чудо можно так
$data = array('color'=>'red','colors'=>array('#fff','#ddd','#eee'));
echo ArrayToXML::toXML($data);
В итоге на выходе получаем
<?xml version="1.0" encoding="utf-8"?> <data> <color>red</color> <colors> <unknownNode>#fff</unknownNode> <unknownNode>#ddd</unknownNode> <unknownNode>#eee</unknownNode> </colors> </data>
Вот по настоящему полезный скрипт


Комментарии
а вот набор элементов уже не создать
Переименовал класс в Xml метод обозвал arrayToXml
На мой взгляд так логичней
$xml = simplexml_load_string("");