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

Discussion in 'XML' started by Summercool, Mar 1, 2008.

  1. Summercool

    Summercool Guest

    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.
    ------------------------------------------------------------------------
     
    Summercool, Mar 1, 2008
    #1
    1. Advertising

  2. Summercool

    petersprc Guest

    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

    On Feb 29, 10:16 pm, Summercool <> 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.
    > ------------------------------------------------------------------------
     
    petersprc, Mar 1, 2008
    #2
    1. Advertising

  3. Summercool

    Summercool Guest

    On Feb 29, 11:51 pm, petersprc <> 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/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.
     
    Summercool, Mar 1, 2008
    #3
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Joseph Geretz
    Replies:
    2
    Views:
    798
    Joseph Geretz
    Sep 30, 2005
  2. Mr. SweatyFinger
    Replies:
    2
    Views:
    2,216
    Smokey Grindel
    Dec 2, 2006
  3. arnuld
    Replies:
    21
    Views:
    1,102
    Old Wolf
    Apr 4, 2007
  4. HANM
    Replies:
    2
    Views:
    762
    Joseph Kesselman
    Jan 29, 2008
  5. candide
    Replies:
    65
    Views:
    1,449
Loading...

Share This Page