php xml转换成数组
//调用方法: $array = xml2array( file_get_contents ( 'feed.xml' , 1, 'attribute' )); */ function xml2array( $contents , $get_attributes =1, $priority = 'tag' ) { if (! $contents ) return array (); if (!function_exists( 'xml_parser_create' )) { //print "'xml_parser_create()' function not found!"; return array (); } //get the xml parser of php - php must have this module for the parser to work $parser = xml_parser_create( '' ); xml_parser_set_option( $parser , xml_option_target_encoding, "utf-8" ); # http: //minutillo测试数据/steve/weblog/2004/6/17/php-xml-and-character-encodings-a-tale-of-sadness-rage-and-data-loss xml_parser_set_option( $parser , xml_option_case_folding, 0); xml_parser_set_option( $parser , xml_option_skip_white, 1); xml_parse_into_struct( $parser , trim( $contents ), $xml_values ); xml_parser_free( $parser ); if (! $xml_values ) return ; //hmm... //initializations $xml_array = array (); $parents = array (); $opened_tags = array (); $arr = array (); $current = & $xml_array ; //refference //go through the tags. $repeated_tag_index = array (); //multiple tags with same name will be turned into an array foreach ( $xml_values as $data ) { unset( $attributes , $value ); //remove existing values, or there will be trouble //this command will extract these variables into the foreach scope // tag(string), type(string), level(int), attributes(array). extract( $data ); //we could use the array by itself, but this cooler. $result = array (); $attributes_data = array (); if (isset( $value )) { if ( $priority == 'tag' ) $result = $value ; else $result [ 'value' ] = $value ; //put the value in a assoc array if we are in the 'attribute' mode } //set the attributes too. if (isset( $attributes ) and $get_attributes ) { foreach ( $attributes as $attr => $val ) { if ( $priority == 'tag' ) $attributes_data [ $attr ] = $val ; else $result [ 'attr' ][ $attr ] = $val ; //set all the attributes in a array called 'attr' } } //see tag status and do the needed. if ( $type == "open" ) { //the starting of the tag '<tag>' $parent [ $level -1] = & $current ; if (! is_array ( $current ) or (!in_array( $tag , array_keys ( $current )))) { //insert new tag $current [ $tag ] = $result ; if ( $attributes_data ) $current [ $tag . '_attr' ] = $attributes_data ; $repeated_tag_index [ $tag . '_' . $level ] = 1; $current = & $current [ $tag ]; } else { //there was another element with the same tag name if (isset( $current [ $tag ][0])) { //if there is a 0th element it is already an array $current [ $tag ][ $repeated_tag_index [ $tag . '_' . $level ]] = $result ; $repeated_tag_index [ $tag . '_' . $level ]++; } else { //this section will make the value an array if multiple tags with the same name appear together $current [ $tag ] = array ( $current [ $tag ], $result ); //this will combine the existing item and the new item together to make an array $repeated_tag_index [ $tag . '_' . $level ] = 2; if (isset( $current [ $tag . '_attr' ])) { //the attribute of the last(0th) tag must be moved as well $current [ $tag ][ '0_attr' ] = $current [ $tag . '_attr' ]; unset( $current [ $tag . '_attr' ]); } } $last_item_index = $repeated_tag_index [ $tag . '_' . $level ]-1; $current = & $current [ $tag ][ $last_item_index ]; } } elseif ( $type == "complete" ) { //tags that ends in 1 line '<tag />' //see if the key is already taken. if (!isset( $current [ $tag ])) { //new key $current [ $tag ] = $result ; $repeated_tag_index [ $tag . '_' . $level ] = 1; if ( $priority == 'tag' and $attributes_data ) $current [ $tag . '_attr' ] = $attributes_data ; } else { //if taken, put all things inside a list(array) if (isset( $current [ $tag ][0]) and is_array ( $current [ $tag ])) { //if it is already an array... // ...push the new element into that array. $current [ $tag ][ $repeated_tag_index [ $tag . '_' . $level ]] = $result ; if ( $priority == 'tag' and $get_attributes and $attributes_data ) { $current [ $tag ][ $repeated_tag_index [ $tag . '_' . $level ] . '_attr' ] = $attributes_data ; } $repeated_tag_index [ $tag . '_' . $level ]++; } else { //if it is not an array... $current [ $tag ] = array ( $current [ $tag ], $result ); //...make it an array using using the existing value and the new value $repeated_tag_index [ $tag . '_' . $level ] = 1; if ( $priority == 'tag' and $get_attributes ) { if (isset( $current [ $tag . '_attr' ])) { //the attribute of the last(0th) tag must be moved as well $current [ $tag ][ '0_attr' ] = $current [ $tag . '_attr' ]; unset( $current [ $tag . '_attr' ]); } if ( $attributes_data ) { $current [ $tag ][ $repeated_tag_index [ $tag . '_' . $level ] . '_attr' ] = $attributes_data ; } } $repeated_tag_index [ $tag . '_' . $level ]++; //0 and 1 index is already taken } } } elseif ( $type == 'close' ) { //end of tag '</tag>' $current = & $parent [ $level -1]; } //开源代码phpfensi测试数据 } return ( $xml_array ); } ######################################################################################################### class parserxml { function parserxml() { } function parserxmlbyurl( $url ) { $fp = @ fopen ( $url , 'r' ); if (! $fp ){ return 1; } $xmlstr = fread ( $fp ,1024); @fclose( $fp ); if ( $xmlstr === false){ return 0; } return $this ->getxmltree( $xmlstr ); } function getxmltree( $xmldata ) { ini_set ( 'track_errors' , '1' ); $xmlreaderror = false; $parser = xml_parser_create(); xml_parser_set_option ( $parser , xml_option_skip_white, 1); xml_parser_set_option ( $parser , xml_option_case_folding, 0); if (!xml_parse_into_struct ( $parser , $xmldata , $vals , $index )) { $xmlreaderror = true; return 0; } xml_parser_free( $parser ); if (! $xmlreaderror ){ $result = array (); $i = 0; if (isset( $vals [ $i ][ 'attributes' ])){ foreach ( array_keys ( $vals [ $i ][ 'attributes' ]) as $attkey ) $attributes [ $attkey ] = $vals [ $i ][ 'attributes' ][ $attkey ]; } $result [ $vals [ $i ][ 'tag' ]] = array_merge (( array ) $attributes , $this ->getchildren( $vals , $i , 'open' )); } ini_set ( 'track_errors' , '0' ); return $result ; } function getchildren ( $vals , & $i , $type ) { if ( $type == 'complete' ) { if (isset ( $vals [ $i ][ 'value' ])) return ( $vals [ $i ][ 'value' ]); else return '' ; } $children = array (); while ( $vals [++ $i ][ 'type' ] != 'close' ) { $type = $vals [ $i ][ 'type' ]; if (isset ( $children [ $vals [ $i ][ 'tag' ]])) { if ( is_array ( $children [ $vals [ $i ][ 'tag' ]])) { $temp = array_keys ( $children [ $vals [ $i ][ 'tag' ]]); if ( is_string ( $temp [0])) { $a = $children [ $vals [ $i ][ 'tag' ]]; unset ( $children [ $vals [ $i ][ 'tag' ]]); $children [ $vals [ $i ][ 'tag' ]][0] = $a ; } } else { $a = $children [ $vals [ $i ][ 'tag' ]]; unset ( $children [ $vals [ $i ][ 'tag' ]]); $children [ $vals [ $i ][ 'tag' ]][0] = $a ; } $children [ $vals [ $i ][ 'tag' ]][] = $this ->getchildren ( $vals , $i , $type ); } else $children [ $vals [ $i ][ 'tag' ]] = $this ->getchildren ( $vals , $i , $type ); if (isset ( $vals [ $i ][ 'attributes' ])) { $attributes = array (); foreach ( array_keys ( $vals [ $i ][ 'attributes' ]) as $attkey ) $attributes [ $attkey ] = $vals [ $i ][ 'attributes' ][ $attkey ]; if (isset ( $children [ $vals [ $i ][ 'tag' ]])) { if ( $children [ $vals [ $i ][ 'tag' ]] == '' ) { unset ( $children [ $vals [ $i ][ 'tag' ]]); $children [ $vals [ $i ][ 'tag' ]] = $attributes ; } elseif ( is_array ( $children [ $vals [ $i ][ 'tag' ]])) { $index = count ( $children [ $vals [ $i ][ 'tag' ]]) - 1; if ( $children [ $vals [ $i ][ 'tag' ]][ $index ] == '' ) { unset ( $children [ $vals [ $i ][ 'tag' ]][ $index ]); $children [ $vals [ $i ][ 'tag' ]][ $index ] = $attributes ; } $children [ $vals [ $i ][ 'tag' ]][ $index ] = array_merge ( $children [ $vals [ $i ][ 'tag' ]][ $index ], $attributes ); } else { $value = $children [ $vals [ $i ][ 'tag' ]]; unset ( $children [ $vals [ $i ][ 'tag' ]]); $children [ $vals [ $i ][ 'tag' ]][ 'value' ] = $value ; $children [ $vals [ $i ][ 'tag' ]] = array_merge ( $children [ $vals [ $i ][ 'tag' ]], $attributes ); } } else $children [ $vals [ $i ][ 'tag' ]] = $attributes ; } } return $children ; ?>查看更多关于php xml转换成数组 - php函数的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did30830