<?php
function
xml2array(
$contents
,
$get_attributes
= 1,
$priority
=
'tag'
) {
if
(!
$contents
)
return
array
();
if
(!function_exists(
'xml_parser_create'
)) {
return
array
();
}
$parser
= xml_parser_create(
''
);
xml_parser_set_option(
$parser
, XML_OPTION_TARGET_ENCODING,
"UTF-8"
);
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
;
$xml_array
=
array
();
$parents
=
array
();
$opened_tags
=
array
();
$arr
=
array
();
$current
= &
$xml_array
;
$repeated_tag_index
=
array
();
foreach
(
$xml_values
as
$data
) {
unset(
$attributes
,
$value
);
extract(
$data
);
$result
=
array
();
$attributes_data
=
array
();
if
(isset(
$value
)) {
if
(
$priority
==
'tag'
)
$result
=
$value
;
else
$result
[
'value'
] =
$value
;
}
if
(isset(
$attributes
)
and
$get_attributes
) {
foreach
(
$attributes
as
$attr
=>
$val
) {
if
(
$priority
==
'tag'
)
$attributes_data
[
$attr
] =
$val
;
else
$result
[
'attr'
][
$attr
] =
$val
;
}
}
if
(
$type
==
"open"
) {
$parent
[
$level
-1] = &
$current
;
if
(!
is_array
(
$current
)
or
(!in_array(
$tag
,
array_keys
(
$current
)))) {
$current
[
$tag
] =
$result
;
if
(
$attributes_data
)
$current
[
$tag
.
'_attr'
] =
$attributes_data
;
$repeated_tag_index
[
$tag
.
'_'
.
$level
] = 1;
$current
= &
$current
[
$tag
];
}
else
{
if
(isset(
$current
[
$tag
][0])) {
$current
[
$tag
][
$repeated_tag_index
[
$tag
.
'_'
.
$level
]] =
$result
;
$repeated_tag_index
[
$tag
.
'_'
.
$level
]++;
}
else
{
$current
[
$tag
] =
array
(
$current
[
$tag
],
$result
);
$repeated_tag_index
[
$tag
.
'_'
.
$level
] = 2;
if
(isset(
$current
[
$tag
.
'_attr'
])) {
$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"
) {
if
(!isset(
$current
[
$tag
])) {
$current
[
$tag
] =
$result
;
$repeated_tag_index
[
$tag
.
'_'
.
$level
] = 1;
if
(
$priority
==
'tag'
and
$attributes_data
)
$current
[
$tag
.
'_attr'
] =
$attributes_data
;
}
else
{
if
(isset(
$current
[
$tag
][0])
and
is_array
(
$current
[
$tag
])) {
$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
{
$current
[
$tag
] =
array
(
$current
[
$tag
],
$result
);
$repeated_tag_index
[
$tag
.
'_'
.
$level
] = 1;
if
(
$priority
==
'tag'
and
$get_attributes
) {
if
(isset(
$current
[
$tag
.
'_attr'
])) {
$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
]++;
}
}
}
elseif
(
$type
==
'close'
) {
$current
= &
$parent
[
$level
-1];
}
}
return
(
$xml_array
);
}
class
array2xml {
public
$output
=
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
;
public
$sub_item
=
array
();
public
function
__construct(
$array
) {
$sub_item
=
array
();
$this
->output .=
$this
->xmlmake(
$array
);
}
public
function
xmlmake(
$array
,
$fk
=
''
) {
$xml
=
''
;
global
$sub_item
;
foreach
(
$array
as
$key
=>
$value
) {
if
(
is_array
(
$value
)) {
if
(
is_numeric
(
$key
)) {
$this
->sub_item=
array_merge
(
$this
->sub_item,
array
(
$fk
));
$xml
.=
"<{$fk}>"
.
$this
->xmlmake(
$value
,
$key
) .
"</{$fk}>"
;
}
else
{
$xml
.=
"<{$key}>"
.
$this
->xmlmake(
$value
,
$key
) .
"</{$key}>"
;
}
}
else
{
$xml
.=
"<{$key}>{$value}</{$key}>\n"
;
}
}
return
$xml
;
}
public
function
output(){
foreach
(
$this
->sub_item
as
$t
){
$this
->output =
str_replace
(
"<{$t}><{$t}>"
,
"<{$t}>"
,
$this
->output);
$this
->output =
str_replace
(
"</{$t}></{$t}>"
,
"</{$t}>"
,
$this
->output);
}
return
$this
->output;
}
}