Как преобразовать объект DOMNodeList в массив

У меня есть этот код:

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

Теперь, $names – это объект DOMNodeList, мне нужно преобразовать этот объект в массив,

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

Вышеприведенный код не работает и возвращает пустой массив, почему?

Solutions Collecting From Web of "Как преобразовать объект DOMNodeList в массив"

Почему нет (массив) ? Поскольку объект DOMNodeList имеет только одно свойство, длину и тип целочисленного типа:

Если объект преобразуется в массив, результатом является массив, элементами которого являются свойства объекта. Ключи – это имена переменных-членов, с несколькими заметными исключениями: целочисленные свойства недоступны ; частные переменные имеют имя класса, добавленное к имени переменной; защищенные переменные имеют «*», добавленные к имени переменной. Эти предварительные значения имеют нулевые байты с обеих сторон.

Поскольку 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, поэтому применяются разные правила.

Используйте iterator_to_array () для преобразования DomNodeList в массив

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

Просто перебирайте элементы и помещайте их в массив:

 $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 .

 $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; } 

Предполагая, что вы хотите получить фактические значения, а не создавать массив узлов DOM:

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