<?php 
namespace imcat;

/**
 * 数组转XML类库
 *  
 * 使用说明:
 *  echo comArr2xml::parse($array, 'root');
 */
 
class comArr2xml {

    private static 
$doc NULL//文档对象
    
private static $version '1.0'//版本号
     
    /**
     * 初始化文档版本及编码
     * 
     * @param string $version   版本号
     * @param string $encoding  XML编码
     */
    
public static function init($version$encoding) {
        
self::$doc = new \DomDocument($version$encoding);
        
self::$doc->formatOutput true;
    }
     
    
/**
     * 转换数组到XML
     * 
     * @param array $array      要转换的数组
     * @param string $rootName  要节点名称
     * @param string $version   版本号
     * @param string $encoding  XML编码
     * 
     * @return string
     */
    
public static function parse($array$rootName 'root'$version '1.0'$encoding 'UTF-8') {
        
self::init($version$encoding);
        
        
//转换
        
$node self::convert($array$rootName);
        
self::$doc->appendChild($node);
        
        return 
self::$doc->saveXML();
    }
     
    
/**
     * 递归转换
     * 
     * @param array $array      数组
     * @param string $nodeName  节点名称
     * @param obj $pareNode  上一级节点
     * 
     * @return object (DOMElement)
     */
    
private static function convert($array$nodeName$pareNode NULL) {
        if (!
is_array($array)) return false;
         
        
//创建父节点。数组键值为数字时,不创建父节点,父节点为上一级节点
        
if(is_numeric($nodeName)){
        
$node $pareNode;
        }else{
        
$node self::createNode($nodeName);
        }
        
        
//循环数组
        
foreach ($array as $key => $value) {
        
        if(
is_numeric($key)){
        
//键值为数字,创建节点。
        //不以数字做节点,以上一级数组键值做节点。将上一级节点当作当前节点进行操作
        
$node self::createNode($nodeName);
        if (!
is_array($value)) {
        
//不是数组,则创建节点的值。
        
$node->appendChild(self::createValue($value));
        
$pareNode->appendChild($node);
        } else {
        
//如果是数组,则递归。
        
$pareNode->appendChild(self::convert($value$key$node));
        }
        }else{
           
$element self::createNode($key);
            
           
//如果不是数组,则创建节点的值
           
if (!is_array($value)) {
               
$element->appendChild(self::createValue($value));
               
$node->appendChild($element);
           } else {
               
//如果是数组,则递归
               
$node->appendChild(self::convert($value$key$node));
           }          
        }            
        }
        return 
$node;
    }
     
    private static function 
createNode($name) {
        
$node NULL;
        
$name $name//strtoupper($name); 
        //如果是字符串,则创建节点
        
if (!is_numeric($name)) {
            
$node self::$doc->createElement($name);
        } else {
            
//如果是数字,则创建默认item节点
            
$node self::$doc->createElement('item');
        }
         
        return 
$node;
    }
     
    
/**
     * 创建文本节点
     * 
     * @param string || bool || integer $value
     * 
     * @return object (DOMText || DOMCDATASection );
     */
    
private static function createValue($value) {
        
$textNode NULL;
         
        
//如果是bool型,则转换为字符串
        
if (true === $value || false === $value) {
            
$textNode self::$doc->createCDATASection($value 'true' 'false');
        } else {
        
//创建CDATA节点
        
$textNode self::$doc->createCDATASection($value);

        }
 
        return 
$textNode;
    }

}