当前位置:首页 > PHP教程 > php函数 > 列表

php xml转换成数组

发布:smiling 来源: PHP粉丝网  添加日期:2014-08-20 15:18:04 浏览: 评论:0 
  1. //调用方法: 
  2. $array =  xml2array(file_get_contents('feed.xml', 1, 'attribute')); 
  3. */ 
  4. function xml2array($contents$get_attributes=1, $priority = 'tag') { 
  5.     if(!$contentsreturn array(); 
  6.  
  7.     if(!function_exists('xml_parser_create')) { 
  8.         //print "'xml_parser_create()' function not found!"; 
  9.         return array(); 
  10.     } 
  11.  
  12.     //get the xml parser of php - php must have this module for the parser to work 
  13.     $parser = xml_parser_create(''); 
  14.     xml_parser_set_option($parser, xml_option_target_encoding, "utf-8"); # http://minutillo.com/steve/weblog/2004/6/17/php-xml-and-character-encodings-a-tale-of-sadness-rage-and-data-loss 
  15.     xml_parser_set_option($parser, xml_option_case_folding, 0); 
  16.     xml_parser_set_option($parser, xml_option_skip_white, 1); 
  17.     xml_parse_into_struct($parser, trim($contents), $xml_values); 
  18.     xml_parser_free($parser); 
  19.  
  20.     if(!$xml_valuesreturn;//hmm... 
  21.  
  22.     //initializations 
  23.     $xml_array = array(); 
  24.     $parents = array(); 
  25.     $opened_tags = array(); 
  26.     $arr = array(); 
  27.  
  28.     $current = &$xml_array//refference 
  29.  
  30.     //go through the tags. 
  31.     $repeated_tag_index = array();//multiple tags with same name will be turned into an array 
  32.     foreach($xml_values as $data) { 
  33.         unset($attributes,$value);//remove existing values, or there will be trouble 
  34.  
  35.         //this command will extract these variables into the foreach scope 
  36.         // tag(string), type(string), level(int), attributes(array). 
  37.         extract($data);//we could use the array by itself, but this cooler. 
  38.  
  39.         $result = array(); 
  40.         $attributes_data = array(); 
  41.  
  42.         if(isset($value)) { 
  43.             if($priority == 'tag'$result = $value
  44.             else $result['value'] = $value//put the value in a assoc array if we are in the 'attribute' mode 
  45.         } 
  46.  
  47.         //set the attributes too. 
  48.         if(isset($attributesand $get_attributes) { 
  49.             foreach($attributes as $attr => $val) { 
  50.                 if($priority == 'tag'$attributes_data[$attr] = $val
  51.                 else $result['attr'][$attr] = $val//set all the attributes in a array called 'attr' 
  52.             } 
  53.         } 
  54.  
  55.         //see tag status and do the needed. 
  56.         if($type == "open") {//the starting of the tag '<tag>' 
  57.             $parent[$level-1] = &$current
  58.             if(!is_array($currentor (!in_array($tagarray_keys($current)))) { //insert new tag 
  59.                 $current[$tag] = $result
  60.                 if($attributes_data$current[$tag'_attr'] = $attributes_data
  61.                 $repeated_tag_index[$tag.'_'.$level] = 1; 
  62.  
  63.                 $current = &$current[$tag]; 
  64.  
  65.             } else { //there was another element with the same tag name 
  66.  
  67.                 if(isset($current[$tag][0])) {//if there is a 0th element it is already an array 
  68.                     $current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result
  69.                     $repeated_tag_index[$tag.'_'.$level]++; 
  70.                 } else {//this section will make the value an array if multiple tags with the same name appear together 
  71.                     $current[$tag] = array($current[$tag],$result);//this will combine the existing item and the new item together to make an array 
  72.                     $repeated_tag_index[$tag.'_'.$level] = 2; 
  73.  
  74.                     if(isset($current[$tag.'_attr'])) { //the attribute of the last(0th) tag must be moved as well 
  75.                         $current[$tag]['0_attr'] = $current[$tag.'_attr']; 
  76.                         unset($current[$tag.'_attr']); 
  77.                     } 
  78.  
  79.                 } 
  80.                 $last_item_index = $repeated_tag_index[$tag.'_'.$level]-1; 
  81.                 $current = &$current[$tag][$last_item_index]; 
  82.             } 
  83.  
  84.         } elseif($type == "complete") { //tags that ends in 1 line '<tag />' 
  85.             //see if the key is already taken. 
  86.             if(!isset($current[$tag])) { //new key 
  87.                 $current[$tag] = $result
  88.                 $repeated_tag_index[$tag.'_'.$level] = 1; 
  89.                 if($priority == 'tag' and $attributes_data$current[$tag'_attr'] = $attributes_data
  90.  
  91.             } else { //if taken, put all things inside a list(array) 
  92.                 if(isset($current[$tag][0]) and is_array($current[$tag])) {//if it is already an array... 
  93.  
  94.                     // ...push the new element into that array. 
  95.                     $current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result
  96.  
  97.                     if($priority == 'tag' and $get_attributes and $attributes_data) { 
  98.                         $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data
  99.                     } 
  100.                     $repeated_tag_index[$tag.'_'.$level]++; 
  101.  
  102.                 } else { //if it is not an array... 
  103.                     $current[$tag] = array($current[$tag],$result); //...make it an array using using the existing value and the new value 
  104.                     $repeated_tag_index[$tag.'_'.$level] = 1; 
  105.                     if($priority == 'tag' and $get_attributes) { 
  106.                         if(isset($current[$tag.'_attr'])) { //the attribute of the last(0th) tag must be moved as well 
  107.  
  108.                             $current[$tag]['0_attr'] = $current[$tag.'_attr']; 
  109.                             unset($current[$tag.'_attr']); 
  110.                         } 
  111.  
  112.                         if($attributes_data) { 
  113.                             $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data
  114.                         } 
  115.                     } 
  116.                     $repeated_tag_index[$tag.'_'.$level]++; //0 and 1 index is already taken 
  117.                 } 
  118.             } 
  119.  
  120.         } elseif($type == 'close') { //end of tag '</tag>' 
  121.             $current = &$parent[$level-1]; 
  122.         }//开源代码phpfensi.com 
  123.     } 
  124.  
  125.     return($xml_array); 
  126.  
  127. ######################################################################################################### 
  128.  
  129. class parserxml 
  130.   function parserxml() 
  131.   { 
  132.  
  133.   } 
  134.   function parserxmlbyurl($url
  135.   { 
  136.      $fp = @fopen($url,'r'); 
  137.   if (!$fp){ 
  138.     return 1; 
  139.   } 
  140.   $xmlstr = fread($fp,1024); 
  141.   @fclose($fp); 
  142.   if ($xmlstr === false){ 
  143.     return 0; 
  144.   } 
  145.   return $this->getxmltree($xmlstr); 
  146.   } 
  147.   function getxmltree($xmldata
  148.   { 
  149.     ini_set ('track_errors''1'); 
  150.     $xmlreaderror = false; 
  151.     $parser = xml_parser_create(); 
  152.     xml_parser_set_option ($parser, xml_option_skip_white, 1); 
  153.     xml_parser_set_option ($parser, xml_option_case_folding, 0); 
  154.     if (!xml_parse_into_struct ($parser$xmldata$vals$index)) { 
  155.        $xmlreaderror = true; 
  156.        return 0; 
  157.     } 
  158.     xml_parser_free($parser); 
  159.  
  160.     if(!$xmlreaderror){ 
  161.        $result = array (); 
  162.        $i = 0; 
  163.        if (isset($vals[$i]['attributes'])){ 
  164.            foreach (array_keys ($vals [$i]['attributes']) as $attkey
  165.            $attributes[$attkey] = $vals[$i]['attributes'][$attkey]; 
  166.     } 
  167.        $result[$vals [$i]['tag']] = array_merge((array)$attributes$this->getchildren($vals$i'open')); 
  168.     } 
  169.     ini_set('track_errors''0'); 
  170.     return $result
  171.   } 
  172.   function getchildren ($vals, &$i$type
  173.   { 
  174.     if ($type == 'complete') { 
  175.        if (isset ($vals [$i]['value'])) 
  176.            return ($vals [$i]['value']); 
  177.        else 
  178.            return ''
  179.   } 
  180.   $children = array (); 
  181.   while ($vals [++$i]['type'] != 'close') { 
  182.        $type = $vals [$i]['type']; 
  183.        if (isset ($children [$vals [$i]['tag']])) { 
  184.            if (is_array ($children [$vals [$i]['tag']])) { 
  185.                $temp = array_keys ($children [$vals [$i]['tag']]); 
  186.                if (is_string ($temp [0])) { 
  187.                    $a = $children [$vals [$i]['tag']]; 
  188.                    unset ($children [$vals [$i]['tag']]); 
  189.                    $children [$vals [$i]['tag']][0] = $a
  190.                } 
  191.            } else { 
  192.                $a = $children [$vals [$i]['tag']]; 
  193.                unset ($children [$vals [$i]['tag']]); 
  194.                $children [$vals [$i]['tag']][0] = $a
  195.            } 
  196.  
  197.            $children [$vals [$i]['tag']][] = $this->getchildren ($vals$i$type); 
  198.        } else 
  199.            $children [$vals [$i]['tag']] = $this->getchildren ($vals$i$type); 
  200.        if (isset ($vals [$i]['attributes'])) { 
  201.            $attributes = array (); 
  202.            foreach (array_keys ($vals [$i]['attributes']) as $attkey
  203.            $attributes [$attkey] = $vals [$i]['attributes'][$attkey]; 
  204.            if (isset ($children [$vals [$i]['tag']])) { 
  205.                if ($children [$vals [$i]['tag']] == '') { 
  206.                    unset ($children [$vals [$i]['tag']]); 
  207.                    $children [$vals [$i]['tag']] = $attributes
  208.                } 
  209.                elseif (is_array ($children [$vals [$i]['tag']])) { 
  210.                    $index = count ($children [$vals [$i]['tag']]) - 1; 
  211.                    if ($children [$vals [$i]['tag']][$index] == '') { 
  212.                        unset ($children [$vals [$i]['tag']][$index]); 
  213.                        $children [$vals [$i]['tag']][$index] = $attributes
  214.                    } 
  215.                    $children [$vals [$i]['tag']][$index] = array_merge ($children [$vals [$i]['tag']][$index], $attributes); 
  216.                } else { 
  217.                    $value = $children [$vals [$i]['tag']]; 
  218.                    unset ($children [$vals [$i]['tag']]); 
  219.                    $children [$vals [$i]['tag']]['value'] = $value
  220.                    $children [$vals [$i]['tag']] = array_merge ($children [$vals [$i]['tag']], $attributes); 
  221.                } 
  222.            } else 
  223.                $children [$vals [$i]['tag']] = $attributes
  224.        } 
  225.   } 
  226.     return $children
  227. ?> 

Tags: php xml转换成数组

分享到: