-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathXML_To_Array.php
108 lines (89 loc) · 1.91 KB
/
XML_To_Array.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php
/*
* PHP Script to convert XML to an associate array
* ===============================================
*
* Usage
* -----
*
* $xml = '<foo></foo>';
*
* $XMLToArray = new XML_To_Array($xml);
*
* print_r($XMLToArray->array);
*
* @package XML_To_Array
* @copyright 2010 ElbertF http://elbertf.com
* @license http://sam.zoy.org/wtfpl/COPYING DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
*
*/
/*
* Convert XML to an array
* @abstract
*/
class XML_To_Array
{
public $array = array();
/*
* Initialize
* @param $xml
*/
function __construct(&$xml)
{
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parse_into_struct($parser, $xml, $values);
xml_parser_free($parser);
foreach ( $values as $value )
{
$tag = $value['tag'];
$i = isset($this->array[$tag]) ? count($this->array[$tag]) : 0;
switch ( $value['type'] )
{
case 'open':
$currentTag = &$this->array[$tag];
if ( isset($value['attributes']) )
{
$currentTag[$i]['_ATTR'] = $value['attributes'];
}
$currentTag[$i]['_RECURSION'] = &$this->array;
$this->array = &$currentTag[$i];
break;
case 'complete':
$currentTag = &$this->array[$tag];
if ( isset($value['attributes']) )
{
$currentTag[$i]['_ATTR'] = $value['attributes'];
}
$currentTag[$i]['_VALUE'] = isset($value['value']) ? $value['value'] : '';
break;
case 'close':
$this->array = &$this->array['_RECURSION'];
break;
}
}
$this->removeRecursion($this->array);
return $this->array;
}
/*
* Remove recursion in result array
* @param $array
*/
function removeRecursion(&$array)
{
if ( $array )
{
foreach ( $array as $k => $v )
{
if ( $k === '_RECURSION' )
{
unset($array[$k]);
}
elseif ( is_array($array[$k]) )
{
$this->removeRecursion($array[$k]);
}
}
}
}
}