note 81931 modified in function.simplexml-element-children by danbrown

From: 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

« previous php.notes (#160633) next »