Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

Почему не работает (массив)? Поскольку объект 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

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

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

Ответ 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;
}