【问题标题】:What exactly does PHP's SimpleXMLElement :: children() return?PHP 的 SimpleXMLElement :: children() 究竟返回了什么?
【发布时间】:2011-10-11 15:15:21
【问题描述】:

根据manual

返回一个 SimpleXMLElement 元素,无论该节点是否有子节点。

但首先,这对我来说没有意义。 children() 肯定会返回一个 SimpleXMLElements 数组。如果节点有多个子节点,返回单个 SimpleXMLElement 怎么可能表示呢?

其次,这与手册中的示例不相关:

foreach ($xml->children() as $second_gen)
   echo ' The person begot a ' . $second_gen['role'];

如何通过 SimpleXMLElement 进行 foreach?我以为你只能用数组来做到这一点?另外, $second_gen 值到底是怎么回事?所以 children() 返回一个关联数组的数组...?

这里肯定有一些我不知道的较深的 PHP 语法规则,所以请解释一下或指向相关的手册页。

【问题讨论】:

    标签: php simplexml


    【解决方案1】:

    何不亲自尝试一下 (demo):

    $foo = new SimpleXmlElement(
    '<foo>
        <bar>
            <baz id="b1"/>
            <baz id="b2"/>
            <baz id="b3"/>
        </bar>
    </foo>
    ');
    

    那就做吧

    var_dump($foo->bar->baz[0]->children());
    

    输出

    object(SimpleXMLElement)#4 (0) {}
    

    那就做吧

    var_dump($foo->bar->children());
    

    输出

    object(SimpleXMLElement)#2 (1) {
      ["baz"]=>
      array(3) {
        [0]=>
        object(SimpleXMLElement)#3 (0) {
        }
        [1]=>
        object(SimpleXMLElement)#5 (0) {
        }
        [2]=>
        object(SimpleXMLElement)#6 (0) {
        }
      }
    }
    

    如何通过 SimpleXMLElement 进行 foreach?我以为你只能用数组来做到这一点?

    好吧,那是错误的。您可以 foreach 任何 Traversable(例如对象和数组等)和任何实现 Iterator 接口的对象。这是SimpleXmlElement的类签名

    Class [ <internal:SimpleXML> <iterateable> class SimpleXMLElement implements Traversable ] {
    

    另外,$second_gen 值到底是怎么回事?所以 children() 返回一个关联数组的数组...?

    不,它没有。它返回一个SimpleXmlElement。通过数组访问访问SimpleXmlElement 从当前节点获取属性(如果是数字,则按位置访问子节点),例如

    echo $foo->bar->baz[2]['id']; // prints "b3"
    

    这有点不明显,因为SimpleXmlElement 没有实现ArrayAccess,但它就是implemented in C。有关更多示例,请参阅http://www.php.net/manual/en/simplexml.examples-basic.php

    【讨论】:

    • @JohnP 因为是周末 ;)
    【解决方案2】:

    来自手册

    注意:SimpleXML 制定了一个规则,将迭代属性添加到大多数 方法。无法使用 var_dump() 或其他任何 可以检查物体。

    这只是意味着返回的对象可以被迭代。因此,即使给定一个对象,您也可以遍历它。

    看看类定义:http://www.php.net/manual/en/class.simplexmlelement.php (注意它实现了traversable

    由于您遍历的每个对象本身都是一个 SimpleXML 对象,您可以简单地在其上调用children() 以更深一层。

    【讨论】:

      猜你喜欢
      • 2013-06-30
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 2017-02-11
      • 1970-01-01
      • 2016-04-21
      相关资源
      最近更新 更多