【问题标题】:How to convert DOMNodeList object into array如何将 DOMNodeList 对象转换为数组
【发布时间】:2016-10-22 01:20:03
【问题描述】:

我有这个代码:

     $dom = new DOMDocument();
     $dom->load('file.xml');
     $names = $dom->getElementsByTagName('name');

现在,$names 是 DOMNodeList 对象,我需要将此对象转换为数组,

     $names = (array)$names;
     var_dump($names);  // empty array

上面的代码不起作用,返回一个空数组,为什么?

【问题讨论】:

    标签: php


    【解决方案1】:

    使用 iterator_to_array() 将 DomNodeList 转换为数组

    $document = new DomDocument();
    $document->load('test.xrds');
    $nodeList = $document->getElementsByTagName('Type');
    $array = iterator_to_array($nodeList);
    

    【讨论】:

    • 这应该是正确的答案。它有效且非常简单。
    • 同意。这是最好的。
    • 这对我不起作用。 Catchable fatal error: Argument 1 passed to iterator_to_array() must implement interface Traversable, instance of DOMNodeList given
    • FWIW,截至我正在阅读的文档 (5.6.35),DOMNodeList 实现了Traversable。文档中的更改日志在更改时保持沉默。我也没有尝试过这个特定的解决方案,可能还有其他错误。
    【解决方案2】:

    为什么(array) 不起作用?因为DOMNodeList 对象只有一个属性length,而且它是整数类型:

    如果将对象转换为数组,则结果是一个数组,其 元素是对象的属性。键是成员变量 名称,除了一些值得注意的例外:整数属性是 无法访问;私有变量的类名附加到 变量的名称;受保护的变量前面有一个“*” 变量的名称。这些前置值的两边都有空字节。

    由于DOMNodeList 实现了Traversable 接口,因此自己创建数组相当容易:

    $array = array();
    foreach($names as $node){
        $array[] = $node;
    }
    

    编辑:我删除了最初的解释,因为它不适用于这里。手册的意思是带有数字名称的属性被传递给数组但无法读取:

    <?php
    
    class Foo{
        public function __construct(){
            $this->{123} = 456;
        }
    }
    
    $array = (array)new Foo;
    var_dump($array);
    var_dump($array['123']);
    
    array(1) {
      ["123"]=>
      int(456)
    }
    
    Notice: Undefined offset: 123 in D:\tmp\borrame.php on line 11
    NULL
    

    解释可能更多的是DOMNodeList不是用PHP代码创建的用户对象,而是用C定义的内置对象,因此适用不同的规则。

    【讨论】:

      【解决方案3】:

      只需遍历元素并将它们放入数组中:

      $names_array = array();
      foreach ($names as $name) {
          $names_array[] = $name; // this is a DOMNode instance
          // you might want to have the textContent of them like this
          $names_array[] = $name->textContent;
      }
      

      这样它们仍然是 DOMNode 实例,您可能想要获取它们的 textContent 属性。

      【讨论】:

        【解决方案4】:
        $dom = new DOMDocument();
        $dom->load('file.xml');
        $names = $dom->getElementsByTagName('name');
        $headlines = array();
        
        foreach($names as $name) {
            $headline = array();
            if($name->childNodes->length) {
                foreach($name->childNodes as $i) {
                    $headline[$i->nodeName] = $i->nodeValue;
                }
            }
        
            $headlines[] = $headline;
        } 
        

        【讨论】:

          【解决方案5】:

          假设您想要实际值而不是创建 DOM 节点数组:

          foreach($nodelist as $node) {
              $values[] = $node->nodeValue;
          }
          

          【讨论】:

            猜你喜欢
            • 2018-02-13
            • 2022-01-23
            • 2011-01-29
            • 2018-07-27
            • 2018-12-12
            • 1970-01-01
            相关资源
            最近更新 更多