This is a discussion on newbie question for XML.. why array == 1st element within the PHP Language forums, part of the PHP Programming Forums category; it seems quite strange that the array also prints out as element 1 in the array in the following: the ...
|
|||||||
| FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
|
|||
|
it seems quite strange that the array also prints out as element 1 in
the array in the following: the second print_r() statement... printing out an array actually prints out the first element... Code: ================================================== ====================== <pre> <?php $xml =<<<XML <?xml version="1.0" encoding="ISO-8859-1"?> <notes> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget this weekend!</body> </note> <note> <to>Tove2</to> <from>Jani2</from> <heading>Reminder2</heading> <body>Don't forget this weekend2!</body> </note> </notes> XML; $xml = new SimpleXMLElement($xml); print_r($xml); print_r($xml->note); print_r($xml->note[0]); print_r($xml->note[1]); echo "\n\nlooping\n\n"; foreach($xml->note as $note) print_r($note); ?> Output: ================================================== ====================== SimpleXMLElement Object ( [note] => Array ( [0] => SimpleXMLElement Object ( [to] => Tove [from] => Jani [heading] => Reminder [body] => Don't forget this weekend! ) [1] => SimpleXMLElement Object ( [to] => Tove2 [from] => Jani2 [heading] => Reminder2 [body] => Don't forget this weekend2! ) ) ) SimpleXMLElement Object ( [to] => Tove [from] => Jani [heading] => Reminder [body] => Don't forget this weekend! ) SimpleXMLElement Object ( [to] => Tove [from] => Jani [heading] => Reminder [body] => Don't forget this weekend! ) SimpleXMLElement Object ( [to] => Tove2 [from] => Jani2 [heading] => Reminder2 [body] => Don't forget this weekend2! ) looping SimpleXMLElement Object ( [to] => Tove [from] => Jani [heading] => Reminder [body] => Don't forget this weekend! ) SimpleXMLElement Object ( [to] => Tove2 [from] => Jani2 [heading] => Reminder2 [body] => Don't forget this weekend2! ) ------------------------------------------------------------------------ if you are egoistic and self-righteous, thinking any other behavior unlike your own is stupid, please do not reply to this post, or your posting will be ignored. ------------------------------------------------------------------------ |
|
|||
|
Hi,
This is because simple XML nodes are stored internally as objects in a linked list. When you use the arrow (->) operator, the first matching child is returned by the read_property object handler. When all of a node's properties are fetched as a result of executing print_r, children with the same name are combined into an array by the get_properties object handler. SimpleXMLElement implements the Travesable interface, which allows you to iterate over these objects using foreach. More info on object handler functions is here: http://www.php-mag.net/magphpde/magp...nodeid,21.html Regards, John Peters On Feb 29, 10:16 pm, Summercool <Summercooln...@gmail.com> wrote: > it seems quite strange that the array also prints out as element 1 in > the array in the following: > > the second print_r() statement... printing out an array actually > prints out the first element... > > Code: > ================================================== ====================== > <pre> > <?php > > $xml =<<<XML > <?xml version="1.0" encoding="ISO-8859-1"?> > <notes> > <note> > <to>Tove</to> > <from>Jani</from> > <heading>Reminder</heading> > <body>Don't forget this weekend!</body> > </note> > <note> > <to>Tove2</to> > <from>Jani2</from> > <heading>Reminder2</heading> > <body>Don't forget this weekend2!</body> > </note> > </notes> > > XML; > > $xml = new SimpleXMLElement($xml); > > print_r($xml); > print_r($xml->note); > print_r($xml->note[0]); > print_r($xml->note[1]); > > echo "\n\nlooping\n\n"; > foreach($xml->note as $note) > print_r($note); > > ?> > > Output: > ================================================== ====================== > SimpleXMLElement Object > ( > [note] => Array > ( > [0] => SimpleXMLElement Object > ( > [to] => Tove > [from] => Jani > [heading] => Reminder > [body] => Don't forget this weekend! > ) > > [1] => SimpleXMLElement Object > ( > [to] => Tove2 > [from] => Jani2 > [heading] => Reminder2 > [body] => Don't forget this weekend2! > ) > > ) > > ) > SimpleXMLElement Object > ( > [to] => Tove > [from] => Jani > [heading] => Reminder > [body] => Don't forget this weekend! > ) > SimpleXMLElement Object > ( > [to] => Tove > [from] => Jani > [heading] => Reminder > [body] => Don't forget this weekend! > ) > SimpleXMLElement Object > ( > [to] => Tove2 > [from] => Jani2 > [heading] => Reminder2 > [body] => Don't forget this weekend2! > ) > > looping > > SimpleXMLElement Object > ( > [to] => Tove > [from] => Jani > [heading] => Reminder > [body] => Don't forget this weekend! > ) > SimpleXMLElement Object > ( > [to] => Tove2 > [from] => Jani2 > [heading] => Reminder2 > [body] => Don't forget this weekend2! > ) > > ------------------------------------------------------------------------ > if you are egoistic and self-righteous, thinking any other behavior > unlike your own is stupid, please do not reply to this post, or > your posting will be ignored. > ------------------------------------------------------------------------ |
|
|||
|
On Feb 29, 11:51 pm, petersprc <peters...@gmail.com> wrote:
> Hi, > > This is because simple XML nodes are stored internally as objects in a > linked list. > > When you use the arrow (->) operator, the first matching child is > returned by the read_property object handler. > > When all of a node's properties are fetched as a result of executing > print_r, children with the same name are combined into an array by the > get_properties object handler. > > SimpleXMLElement implements the Travesable interface, which allows you > to iterate over these objects using foreach. > > More info on object handler functions is here:http://www.php-mag.net/magphpde/magp...,id,382,nodeid... that's interesting... so in other words... if i pass $xml->note to a function, the memory of exactly 1 node is passed. in other language... a linked list will have a member variable $next that explicitly points to the next member... so in PHP, it looks like a node, without having a $next... and yet it is a linked list. and print_r will print it as an Array type. |