PHP XML To Array,将XML转换为数组

代码
// Xml 转 数组, 包括根键,忽略空元素和属性,尚有重大错误
function xml_to_array( $xml )
{
    
$reg = "/<(\\w+)[^>]*?>([\\x00-\\xFF]*?)<\\/\\1>/";
    
if(preg_match_all($reg, $xml, $matches))
    {
        
$count = count($matches[0]);
        
$arr = array();
        
for($i = 0$i < $count$i++)
        {
            
$key= $matches[1][$i];
            
$val = xml_to_array( $matches[2][$i] );  // 递归
            if(array_key_exists($key, $arr))
            {
                
if(is_array($arr[$key]))
                {
                    
if(!array_key_exists(0,$arr[$key]))
                    {
                        
$arr[$key= array($arr[$key]);
                    }
                }
else{
                    
$arr[$key= array($arr[$key]);
                }
                
$arr[$key][] = $val;
            }
else{
                
$arr[$key= $val;
            }
        }
        
return $arr;
    }
else{
        
return $xml;
    }
}
// Xml 转 数组, 不包括根键
function xmltoarray( $xml )
{
    
$arr = xml_to_array($xml);
    
$key = array_keys($arr);
    
return $arr[$key[0]];
}
代码
// 类似 XPATH 的数组选择器
function xml_array_select( $arr, $arrpath )
{
    
$arrpath = trim$arrpath, '/' );
    
if(!$arrpathreturn $arr;
    
$self = 'xml_array_select';
    
    
$pos = strpos$arrpath, '/' );
    
$pos = $pos ? $pos : strlen($arrpath);
    
$curpath = substr($arrpath, 0, $pos);
    
$next = substr($arrpath, $pos);
    
    
if(preg_match("/\\[(\\d+)\\]$/",$curpath,$predicate))
    {
        
$curpath = substr($curpath, 0, strpos($curpath,"[{$predicate[1]}]"));
        
$result = $arr[$curpath][$predicate[1]];
    }
else $result = $arr[$curpath];
    
    
ifis_array($arr&& !array_key_exists($curpath, $arr) )
    {
        
die'key is not exists:' . $curpath );
    }
    
    
return $self($result, $next);
}
// 如果输入的数组是全数字键,则将元素值依次传输到 $callback, 否则将自身传输给$callback
function xml_array_each( $arr, $callback )
{
    
if(func_num_args()<2die('parameters error');
    
if(!is_array($arr)) die('parameter 1 shuld be an array!');
    
if(!is_callable($callback)) die('parameter 2 shuld be an function!');
    
$keys = array_keys($arr);
    
$isok = true;
    
foreach$keys as $key ) {if(!is_int($key)) {$isok = falsebreak;}}
    
if($isok)
        
foreach$arr as $val ) $result[] = $callback($val);
    
else
        
$result[] = $callback$arr );
    
return $result;
}
/**
 * 最简单的XML转数组
 * @param string $xmlstring XML字符串
 * @return array XML数组
 */
function simplest_xml_to_array($xmlstring) {
    return json_decode(json_encode((array) simplexml_load_string($xmlstring)), true);
}

 

posted on 2009-12-31 17:17 还是刀哥靠谱 阅读(...) 评论(...) 编辑 收藏

导航

公告