public function xml2array($contents, $get_attributes = 0) {
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_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, $contents, $xml_values);
xml_parser_free($parser);
if (!$xml_values) {
return array();
}
//Initializations
$xml_array = array();
$parents = array();
$opened_tags = array();
$arr = array();
$current = &$xml_array;
//Go through the tags.
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 = '';
if ($get_attributes) { //The second argument of the function decides this.
$result = array();
if (isset($value)) {
$result['value'] = $value;
}
//Set the attributes too.
if (isset($attributes)) {
foreach ($attributes as $attr => $val) {
if ($get_attributes == 1) {
$result['attr'][$attr] = $val;
}
}
}
} else if (isset($value)) {
$result = $value;
}
//See tag status and do the needed.
//The starting of the tag '<tag>'
if ($type == "open") {
$parent[$level - 1] = &$current;
//Insert New tag
if (!is_array($current) or (!in_array($tag, array_keys($current)))) {
$current[$tag] = $result;
$current = &$current[$tag];
} else {
//There was another element with the same tag name
if (isset($current[$tag][0])) {
array_push($current[$tag], $result);
} else {
$current[$tag] = array(
$current[$tag],
$result
);
}
$last = count($current[$tag]) - 1;
$current = &$current[$tag][$last];
}
} 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;
} else {
//If taken, put all things inside a list(array)
if ((is_array($current[$tag]) and $get_attributes == 0) or (isset($current[$tag][0]) and is_array($current[$tag][0]) and $get_attributes == 1)) {
array_push($current[$tag], $result);
// ...push the new element into that array.
} 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
}
}
} elseif ($type == 'close') {
//End of tag '</tag>'
$current = &$parent[$level - 1];
}
}
return ($xml_array);
}