note 81931 modified in function.simplexml-element-children by danbrown
| From: | danbrown@php.net | Date: | Wed, 16 Sep 2009 15:33:46 +0000 |
| Subject: | note 81931 modified in function.simplexml-element-children by danbrown | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-160633@lists.php.net to get a copy of this message | ||
I made a slightly differnt approch towards the RecurseXML function. Beeing hungry I had problems
with the code, as it did just overwrite two <maincourse>s. So here is what I did:
<?php
$xml = new SimpleXMLElement(
'<meal>
<type>Lunch</type>
<time>12:30</time>
<menu>
<entree>salad</entree>
<maincourse>
<part>ships</part>
<part>steak</part>
</maincourse>
<maincourse>
<part>fisch</part>
<part>rice</part>
</maincourse>
<maincourse>
<part>wine</part>
<part>cheese</part>
</maincourse>
</menu>
</meal>');
$vals = array();
RecurseXML($xml,$vals);
foreach($vals as $key=>$value)
print("{$key} = {$value}<BR>\n");
function RecurseXML($xml,&$vals,$parent="") {
$childs=0;
$child_count=-1; # Not realy needed.
$arr=array();
foreach ($xml->children() as $key=>$value) {
if (in_array($key,$arr)) {
$child_count++;
} else {
$child_count=0;
}
$arr[]=$key;
$k=($parent == "") ? "$key.$child_count" :
"$parent.$key.$child_count";
$childs=RecurseXML($value,$vals,$k);
if ($childs==0) {
$vals[$k]= (string)$value;
}
}
return $childs;
}
?>
Output is like this:
type.0 = Lunch
time.0 = 12:30
menu.0.entree.0 = salad
menu.0.maincourse.0.part.0 = ships
menu.0.maincourse.0.part.1 = steak
menu.0.maincourse.0 =
menu.0.maincourse.1.part.0 = fisch
menu.0.maincourse.1.part.1 = rice
menu.0.maincourse.1 =
menu.0.maincourse.2.part.0 = wine
menu.0.maincourse.2.part.1 = cheese
menu.0.maincourse.2 =
menu.0 =
(Not beautiful, but it solved my case...)
--was--
I made a slightly differnt approch towards the RecurseXML function. Beeing hungry I had problems
with the code, as it did just overwrite two <maincourse>s. So here is what I did:
<?php
$xml = new SimpleXMLElement(
'<meal>
<type>Lunch</type>
<time>12:30</time>
<menu>
<entree>salad</entree>
<maincourse>
<part>ships</part>
<part>steak</part>
</maincourse>
<maincourse>
<part>fisch</part>
<part>rice</part>
</maincourse>
<maincourse>
<part>wine</part>
<part>cheese</part>
</maincourse>
</menu>
</meal>');
$vals = array();
RecurseXML($xml,$vals);
foreach($vals as $key=>$value)
print("{$key} = {$value}<BR>\n");
function RecurseXML($xml,&$vals,$parent="") {
$childs=0;
$child_count=-1; # Not realy needed.
$arr=array();
foreach ($xml->children() as $key=>$value) {
if (in_array($key,$arr)) {
$child_count++;
} else {
$child_count=0;
}
$arr[]=$key;
$k=($parent == "") ? "$key.$child_count" :
"$parent.$key.$child_count";
$childs=RecurseXML($value,$vals,$k);
if ($childs==0) {
$vals[$k]= (string)$value;
}
}
return $childs;
}
?>
Output is like this:
type.0 = Lunch
time.0 = 12:30
menu.0.entree.0 = salad
menu.0.maincourse.0.part.0 = ships
menu.0.maincourse.0.part.1 = steak
menu.0.maincourse.0 =
menu.0.maincourse.1.part.0 = fisch
menu.0.maincourse.1.part.1 = rice
menu.0.maincourse.1 =
menu.0.maincourse.2.part.0 = wine
menu.0.maincourse.2.part.1 = cheese
menu.0.maincourse.2 =
menu.0 =
(Not beautiful, but it solved my case...)
http://php.net/manual/en/function.simplexml-element-children.php