newbie question for XML.. why array == 1st element

S

Summercool

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
=> Reminder
[body] => Don't forget this weekend!
)

[1] => SimpleXMLElement Object
(
[to] => Tove2
[from] => Jani2
=> Reminder2
[body] => Don't forget this weekend2!
)

)

)
SimpleXMLElement Object
(
[to] => Tove
[from] => Jani
=> Reminder
[body] => Don't forget this weekend!
)
SimpleXMLElement Object
(
[to] => Tove
[from] => Jani
=> Reminder
[body] => Don't forget this weekend!
)
SimpleXMLElement Object
(
[to] => Tove2
[from] => Jani2
=> Reminder2
[body] => Don't forget this weekend2!
)


looping

SimpleXMLElement Object
(
[to] => Tove
[from] => Jani
=> Reminder
[body] => Don't forget this weekend!
)
SimpleXMLElement Object
(
[to] => Tove2
[from] => Jani2
=> Reminder2
[body] => Don't forget this weekend2!
)​
 
P

petersprc

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/magphpde_article/psecom,id,382,nodeid,21.html

Regards,

John Peters

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
=> Reminder
[body] => Don't forget this weekend!
)

[1] => SimpleXMLElement Object
(
[to] => Tove2
[from] => Jani2
=> Reminder2
[body] => Don't forget this weekend2!
)

)

)
SimpleXMLElement Object
(
[to] => Tove
[from] => Jani
=> Reminder
[body] => Don't forget this weekend!
)
SimpleXMLElement Object
(
[to] => Tove
[from] => Jani
=> Reminder
[body] => Don't forget this weekend!
)
SimpleXMLElement Object
(
[to] => Tove2
[from] => Jani2
=> Reminder2
[body] => Don't forget this weekend2!
)

looping

SimpleXMLElement Object
(
[to] => Tove
[from] => Jani
=> Reminder
[body] => Don't forget this weekend!
)
SimpleXMLElement Object
(
[to] => Tove2
[from] => Jani2
=> 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.
------------------------------------------------------------------------​
 
S

Summercool

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/magphpde_article/psecom,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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,011
Latest member
AjaUqq1950

Latest Threads

Top