我有这段代码:
$dom = new DOMDocument();
$dom->load('file.xml');
$names = $dom->getElementsByTagName('name');
现在,$names
是DOMNodeList对象,我需要将此对象转换为数组,
$names = (array)$names;
var_dump($names); // empty array
上面的代码不起作用并返回一个空数组,为什么?
答案 0 :(得分:49)
使用iterator_to_array()将DomNodeList转换为数组
$document = new DomDocument();
$document->load('test.xrds');
$nodeList = $document->getElementsByTagName('Type');
$array = iterator_to_array($nodeList);
答案 1 :(得分:7)
为什么(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定义的内置对象,因此适用不同的规则。
答案 2 :(得分: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
属性。
答案 3 :(得分:1)
假设您需要实际值而不是创建DOM节点数组:
foreach($nodelist as $node) {
$values[] = $node->nodeValue;
}
答案 4 :(得分:0)
$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;
}