如何将DOMNodeList对象转换为数组

OTA*_*TAR 16 php

我有这个代码:

     $dom = new DOMDocument();
     $dom->load('file.xml');
     $names = $dom->getElementsByTagName('name');
Run Code Online (Sandbox Code Playgroud)

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

     $names = (array)$names;
     var_dump($names);  // empty array
Run Code Online (Sandbox Code Playgroud)

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

小智 54

使用iterator_to_array()将DomNodeList转换为Array

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

  • 这应该是正确的答案。它的工作原理非常简单。 (2认同)

Álv*_*lez 7

为什么不(数组)工作?因为DOMNodeList对象只有一个属性,长度,而且它是整数类型:

如果将对象转换为数组,则结果是一个数组,其元素是对象的属性.键是成员变量名,有一些值得注意的例外:整数属性是不可访问的 ; 私有变量的类名前置于变量名; 受保护的变量在变量名前面加上'*'.这些前置值在任一侧都有空字节.

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

$array = array();
foreach($names as $node){
    $array[] = $node;
}
Run Code Online (Sandbox Code Playgroud)

编辑:我已删除了初步说明,因为它不适用于此处.手册的含义是具有数字名称的属性传递给数组但无法读取:

<?php

class Foo{
    public function __construct(){
        $this->{123} = 456;
    }
}

$array = (array)new Foo;
var_dump($array);
var_dump($array['123']);
Run Code Online (Sandbox Code Playgroud)
array(1) {
  ["123"]=>
  int(456)
}

Notice: Undefined offset: 123 in D:\tmp\borrame.php on line 11
NULL
Run Code Online (Sandbox Code Playgroud)

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


com*_*857 5

只需迭代元素并将它们放入数组中即可:

$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;
}
Run Code Online (Sandbox Code Playgroud)

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