- /**
- * The main function for converting to an XML document.
- * Pass in a multi dimensional array and this recrusively loops through and builds up an XML document.
- *
- * @param array $data
- * @param SimpleXMLElement $xml - should only be used recursively
- * @return string XML
- */
- public static function array2xml($data, $xml=null)
- {
- // turn off compatibility mode as simple xml throws a wobbly if you don't.
- if (ini_get('zend.ze1_compatibility_mode') == 1)
- {
- ini_set ('zend.ze1_compatibility_mode', 0);
- }
- $root = null;
- if ($xml == null)
- {
- $keys = array_keys($data);
- $root = $keys[0];
- $xml = simplexml_load_string("<?xml version='1.0' encoding='utf-8'?><$root/>");
- //Only when empty root element
- if(empty($data[$root])) {
- return $xml->asXML();
- }
- else if(is_string($data[$root])) {
- $xml = simplexml_load_string("<?xml version='1.0' encoding='utf-8'?><$root>".$data[$root]."</$root>");
- return $xml->asXML();
- }
- }
- // loop through the data passed in.
- foreach($data as $key => $value)
- {
- if(!empty($root)) {
- if(is_array($value)) {
- XML::array2xml($value, $xml);
- }
- }
- else {
- // no numeric keys in our xml please!
- if (is_numeric($key))
- {
- // make string key...
- $key = "unknownNode_". (string) $key;
- }
- // replace anything not alpha numeric
- $key = preg_replace('/[^a-z]/i', '', $key);
- // if there is another array found recrusively call this function
- if (is_array($value) && !isset($value[0]))
- {
- $node = $xml->addChild($key);
- // recrusive call.
- XML::array2xml($value, $node);
- }
- else
- {
- if(!is_array($value)) {
- $value = htmlentities($value);
- $xml->addChild($key,$value);
- }
- else {
- foreach($value as $v) {
- if(is_array($v)) {
- $node = $xml->addChild($key);
- // recrusive call.
- XML::array2xml($v, $node);
- }
- else {
- $v = htmlentities($v);
- $xml->addChild($key,$v);
- }
- }
- }
- }
- }
- }
- // pass back as string. or simple xml object if you want!
- return $xml->asXML();
- }