dcvb 发表于 2015-8-24 11:18:30

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);
      $arr = array();
      for($i = 0; $i < $count; $i++)
      {
            $key= $matches[$i];
            $val = xml_to_array( $matches[$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];
}

代码



// 类似 XPATH 的数组选择器
function xml_array_select( $arr, $arrpath )
{
    $arrpath = trim( $arrpath, '/' );
    if(!$arrpath) return $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}]"));
      $result = $arr[$curpath][$predicate];
    }else $result = $arr[$curpath];
    if( is_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()<2) die('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 = false; break;}}
    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);
}
  
页: [1]
查看完整版本: PHP XML To Array,将XML转换为数组