note 109032 deleted from function.xml-parse-into-struct by cmb
| From: | cmb@php.net | Date: | Sun, 06 Oct 2019 08:26:08 +0000 |
| Subject: | note 109032 deleted from function.xml-parse-into-struct by cmb | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-212521@lists.php.net to get a copy of this message | ||
Note Submitter: andy at andynformatics dot de
----
To get out of an XML-Structure like this:
<root><element><subelement attribute="value">some
text</subelement></element><anotherelement>Hello
World</anotherelement></root>
something like this:
Array
(
[tag] => ROOT
[0] => Array
(
[tag] => ELEMENT
[0] => Array
(
[tag] => SUBELEMENT
[attributes] => Array
(
[ATTRIBUTE] => value
)
[value] => some text
)
)
[1] => Array
(
[tag] => ANOTHERELEMENT
[value] => Hello World
)
)
I have written a short and pretty simple function:
<?php
function xml2array($xml){
$opened = array();
$opened[1] = 0;
$xml_parser = xml_parser_create();
xml_parse_into_struct($xml_parser, $xml, $xmlarray);
$array = array_shift($xmlarray);
unset($array["level"]);
unset($array["type"]);
$arrsize = sizeof($xmlarray);
for($j=0;$j<$arrsize;$j++){
$val = $xmlarray[$j];
switch($val["type"]){
case "open":
$opened[$val["level"]]=0;
case "complete":
$index = "";
for($i = 1; $i < ($val["level"]); $i++)
$index .= "[" . $opened[$i] . "]";
$path = explode('][', substr($index, 1, -1));
$value = &$array;
foreach($path as $segment)
$value = &$value[$segment];
$value = $val;
unset($value["level"]);
unset($value["type"]);
if($val["type"] == "complete")
$opened[$val["level"]-1]++;
break;
case "close":
$opened[$val["level"]-1]++;
unset($opened[$val["level"]]);
break;
}
}
return $array;
}
?>