As follows:
Copy codeThe Code is as follows:
<?
/**
* Xml2array () will convert the given XML text to an array in the XML structure.
* Link: http://www.bin-co.com/php/scripts/xml2array/
* Arguments: $ contents-The XML text
* $ Get_attributes-1 or 0. If this is 1 the function will get the attributes as well as the tag values-this results in a different array structure in the return value.
* $ Priority-Can be 'tag' or 'attribute'. This will change the way the resulting array sturcture. For 'tag', the tags are given more importance.
* Return: The parsed XML in an array form. Use print_r () to see the resulting array structure.
* Examples: $ array = xml2array (file_get_contents ('feed. xml '));
* $ Array = xml2array (file_get_contents ('feed. xml', 1, 'attribute '));
*/
Function xml2array ($ contents, $ get_attributes = 1, $ priority = 'tag '){
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_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
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; // Hmm...
// Initializations
$ Xml_array = array ();
$ Parents = array ();
$ Opened_tags = array ();
$ Arr = array ();
$ Current = & $ xml_array; // Refference
// Go through the tags.
$ Repeated_tag_index = array (); // Multiple tags with same name will be turned into an array
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 cocould use the array by itself, but this cooler.
$ Result = array ();
$ Attributes_data = array ();
If (isset ($ value )){
If ($ priority = 'tag') $ result = $ value;
Else $ result ['value'] = $ value; // Put the value in a assoc array if we are in the 'attribute' mode
}
// Set the attributes too.
If (isset ($ attributes) and $ get_attributes ){
Foreach ($ attributes as $ attr => $ val ){
If ($ priority = 'tag') $ attributes_data [$ attr] = $ val;
Else $ result ['attr'] [$ attr] = $ val; // Set all the attributes in a array called 'attr'
}
}
// See tag status and do the needed.
If ($ type = "open") {// The starting of the tag '<tag>'
$ Parent [$ level-1] = & $ current;
If (! Is_array ($ current) or (! In_array ($ tag, array_keys ($ current) {// Insert New tag
$ Current [$ tag] = $ result;
If ($ attributes_data) $ current [$ tag. '_ attr'] = $ attributes_data;
$ Repeated_tag_index [$ tag. '_'. $ level] = 1;
$ Current = & $ current [$ tag];
} Else {// There was another element with the same tag name
If (isset ($ current [$ tag] [0]) {// If there is a 0th element it is already an array
$ Current [$ tag] [$ repeated_tag_index [$ tag. '_'. $ level] = $ result;
$ Repeated_tag_index [$ tag. '_'. $ level] ++;
} Else {// This section will make the value an array if multiple tags with the same name appear together
$ Current [$ tag] = array ($ current [$ tag], $ result); // This will combine the existing item and the new item together to make an array
$ Repeated_tag_index [$ tag. '_'. $ level] = 2;
If (isset ($ current [$ tag. '_ attr']) {// The attribute of the last (0th) tag must be moved as well
$ 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") {// Tags that ends in 1 line' <tag/>'
// See if the key is already taken.
If (! Isset ($ current [$ tag]) {// New Key
$ Current [$ tag] = $ result;
$ Repeated_tag_index [$ tag. '_'. $ level] = 1;
If ($ priority = 'tag' and $ attributes_data) $ current [$ tag. '_ attr'] = $ attributes_data;
} Else {// If taken, put all things inside a list (array)
If (isset ($ current [$ tag] [0]) and is_array ($ current [$ tag]) {// If it is already an array...
//... Push the new element into that array.
$ 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 {// If it is not an array...
$ Current [$ tag] = array ($ current [$ tag], $ result); //... Make it an array using the existing value and the new value
$ Repeated_tag_index [$ tag. '_'. $ level] = 1;
If ($ priority = 'tag' and $ get_attributes ){
If (isset ($ current [$ tag. '_ attr']) {// The attribute of the last (0th) tag must be moved as well
$ 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] ++; // 0 and 1 index is already taken
}
}
} Elseif ($ type = 'close') {// End of tag' </tag>'
$ Current = & $ parent [$ level-1];
}
}
Return ($ xml_array );
}
?>
Function Description and example:
Copy codeThe Code is as follows:
$ Arr = xml2array (file_get_contents ("tools. xml"), 1, 'attribute ');