У меня есть этот код:
$dom = new DOMDocument(); $dom->load('file.xml'); $names = $dom->getElementsByTagName('name');
Теперь, $names
– это объект DOMNodeList, мне нужно преобразовать этот объект в массив,
$names = (array)$names; var_dump($names); // empty array
Вышеприведенный код не работает и возвращает пустой массив, почему?
Почему нет (массив) ? Поскольку объект 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; }