>  기사  >  백엔드 개발  >  xml을 배열로 변환하는 PHP 함수

xml을 배열로 변환하는 PHP 함수

WBOY
WBOY원래의
2016-07-25 08:59:08869검색
  1. /**

  2. * xml2array()는 지정된 XML 텍스트를 XML 구조의 배열로 변환합니다.
  3. * 인수: $contents - XML ​​텍스트
  4. * $get_attributes - 1 또는 0. 이것이 1인 경우 함수 태그 값뿐만 아니라 속성도 가져옵니다. 이로 인해 반환 값의 배열 구조가 달라집니다.
  5. * $priority - '태그' 또는 '속성'일 수 있습니다. 그러면 결과 배열 구조가 변경됩니다. '태그'의 경우 태그의 중요성이 더 높습니다.
  6. * 반환: 배열 형식의 구문 분석된 XML입니다. 결과 배열 구조를 보려면 print_r()을 사용하십시오.
  7. * 예: $array = xml2array(file_get_contents('feed.xml'));
  8. * $array = xml2array(file_get_contents('feed.xml', 1) , '속성'));
  9. */
  10. function xml2array($contents, $get_attributes=1, $priority = 'tag') {
  11. if(!$contents) return array();
  12. if(!function_exists('xml_parser_create')) {
  13. //print "'xml_parser_create()' 함수 없음 found!";
  14. return array();
  15. }
  16. //PHP의 XML 파서 가져오기 - 파서가 작동하려면 PHP에 이 모듈이 있어야 합니다
  17. $parser = xml_parser_create('');
  18. xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
  19. xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
  20. xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
  21. xml_parse_into_struct($parser, Trim($contents), $xml_values);
  22. xml_parser_free($ 파서);
  23. if(!$xml_values) return;//흠...
  24. //초기화 bbs.it-home.org
  25. $xml_array = array();
  26. $parents = array ();
  27. $opened_tags = array();
  28. $arr = array();
  29. $current = &$xml_array; //참조
  30. //태그를 살펴보세요.
  31. $repeated_tag_index = array();//같은 이름을 가진 여러 태그가 배열로 변환됩니다
  32. foreach($xml_values ​​as $data) {
  33. unset($attributes,$value);//기존 값을 제거하지 않으면 문제가 발생합니다
  34. //이 명령은 이러한 변수를 foreach 범위로 추출합니다
  35. // tag(string), type(string) , level(int), attribute(array).
  36. extract($data);//배열 자체를 사용할 수도 있지만 이 방법이 더 멋집니다.
  37. $result = array();
  38. $attributes_data = array();

  39. if(isset($value)) {

  40. if($priority == 'tag') $result = $value;
  41. else $result ['값'] = $값; //'속성' 모드인 경우 연관 배열에 값을 넣습니다
  42. }
  43. //속성도 설정합니다.
  44. if(isset($attributes) and $get_attributes) {
  45. foreach($attributes as $attr => $val) {
  46. if($priority == 'tag') $attributes_data[$attr] = $val;
  47. else $result['attr'][$ 속성] = $val; //'attr'이라는 배열에 모든 속성을 설정합니다
  48. }
  49. }
  50. //태그 상태를 확인하고 필요한 작업을 수행합니다.
  51. if($type == "open") {// 태그 시작 ''
  52. $parent[$level-1] = &$current;
  53. if(!is_array($current) 또는 (!in_array($tag, array_keys($current) )))) { //새 태그 삽입
  54. $current[$tag] = $result;
  55. if($attributes_data) $current[$tag. '_attr'] = $attributes_data;
  56. $repeated_tag_index[$tag.'_'.$level] = 1;
  57. $current = &$current[$tag];
  58. } else { //거기 동일한 태그 이름을 가진 다른 요소
  59. if(isset($current[$tag][0])) {//0번째 요소가 있으면 이미 배열입니다
  60. $current[$tag][ $repeated_tag_index[$tag.'_'.$level]] = $result;
  61. $repeated_tag_index[$tag.'_'.$level] ;
  62. } else {//이 섹션에서는 값을 동일한 이름을 가진 여러 태그가 함께 나타나는 경우 배열
  63. $current[$tag] = array($current[$tag],$result);//기존 항목과 새 항목을 결합하여 배열을 만듭니다.
  64. $repeated_tag_index[$tag.'_'.$level] = 2;

  65. if(isset($current[$tag.'_attr'])) { // 마지막(0번째) 태그의 속성도 이동해야 합니다

  66. $current[$tag]['0_attr'] = $current[$tag.'_attr'];
  67. unset($current[$tag .'_attr']);
  68. }
  69. }
  70. $last_item_index = $repeated_tag_index[$tag.'_'.$level]-1;
  71. $current = &$current[$tag] [$last_item_index];
  72. }
  73. } elseif($type == "complete") { //한 줄로 끝나는 태그 ''
  74. //키가 있는지 확인 이미 사용되었습니다.
  75. if(!isset($current[$tag])) { //새 키
  76. $current[$tag] = $result;
  77. $repeated_tag_index[$tag.'_'. $level] = 1;
  78. if($priority == 'tag' 및 $attributes_data) $current[$tag. '_attr'] = $attributes_data;
  79. } else { //만약 취했다면 모든 것을 목록(배열) 안에 넣습니다
  80. if(isset($current[$tag][0]) 및 is_array($current [$tag])) {//이미 배열인 경우...
  81. // ...새 요소를 해당 배열에 푸시합니다.
  82. $current[$tag][$repeated_tag_index[$tag. '_'.$level]] = $result;

  83. if($priority == 'tag' 및 $get_attributes 및 $attributes_data) {

  84. $current[$tag] [$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;
  85. }
  86. $repeated_tag_index[$tag.'_'.$level] ;
  87. }else { //배열이 아닌 경우...
  88. $current[$tag] = array($current[$tag],$result); //...기존 값과 새 값을 사용하여 배열로 만듭니다
  89. $repeated_tag_index[$tag.'_'.$level] = 1;
  90. if($priority == 'tag' and $get_attributes) {
  91. if(isset($current[$tag.'_attr'])) { //마지막(0번째) 태그의 속성도 함께 이동해야 합니다

  92. unset($current[$tag.'_attr']);
  93. }

  94. if($attributes_data) {

  95. $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;
  96. }
  97. }
  98. $repeated_tag_index[$tag.'_'.$level] ; //0 및 1 인덱스는 이미 사용 중입니다
  99. }
  100. }
  101. } elseif($type == 'close') { //'' 태그 끝
  102. $current = &$parent[$level-1];
  103. }
  104. }

  105. return($xml_array);

  106. }
  107. ?>
复代码

调用示例:

  1. //php之XML转数组函数 调用
  2. $arr = xml2array(file_get_contents("tools.xml") ,1,'속성');
  3. ?>
复제대码


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.