23

我有这个代码:

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

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

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

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

4

5 回答 5

74

使用 iterator_to_array() 将 DomNodeList 转换为 Array

$document = new DomDocument();
$document->load('test.xrds');
$nodeList = $document->getElementsByTagName('Type');
$array = iterator_to_array($nodeList);
于 2014-01-29T13:18:50.340 回答
6

为什么(数组)不起作用?因为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 定义的内置对象,因此适用不同的规则。

于 2013-04-04T09:35:24.817 回答
4

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

$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属性。

于 2013-04-04T09:31:49.463 回答
1
$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;
} 
于 2013-04-04T09:34:39.587 回答
1

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

foreach($nodelist as $node) {
    $values[] = $node->nodeValue;
}
于 2016-10-21T17:20:03.080 回答