好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

php xml转换成数组 - php函数

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函数的详细内容...

  阅读:47次