2013-04-04 10 views
13

Ich habe diesen Code:Wie DOMNodeList Objekt in einem Array konvertieren

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

Nun $names ist DOMNodeList Objekt, ich brauche dieses Objekt in ein Array zu konvertieren,

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

Der obige Code funktioniert funktioniert nicht und gibt ein leeres Array zurück, warum?

Antwort

7

Warum funktioniert (array) Arbeit? Da ein DOMNodeList Objekt nur eine Eigenschaft hat, length, und es ist der Integer-Typ:

If an object is converted to an array, the result is an array whose elements are the object's properties. The keys are the member variable names, with a few notable exceptions: integer properties are unaccessible; private variables have the class name prepended to the variable name; protected variables have a '*' prepended to the variable name. These prepended values have null bytes on either side.

Da ein DOMNodeList implementiert die Traversable Schnittstelle, ist es ziemlich einfach das Array zu erstellen selbst:

$array = array(); 
foreach($names as $node){ 
    $array[] = $node; 
} 

Bearbeiten: Ich habe die ursprüngliche Erklärung entfernt, weil es hier nicht gilt. Was die manuellen Mittel ist, dass Eigenschaften mit numerischen Namen auf das Array übergeben werden, aber nicht gelesen werden können:

<?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 

Die Erklärung dafür ist wahrscheinlich mehr auf der Linie, dass DOMNodeList kein Benutzerobjekt mit PHP-Code erstellt ist, aber ein in C definiertes eingebautes Objekt, so gelten andere Regeln.

3

Gerade Iterierte Trog die Elemente und sie in ein Array setzen:

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

Auf diese Weise werden sie noch DOMNode Fälle geben, könnten Sie ihre textContent Eigenschaft erhalten möchten.

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

Verwenden iterator_to_array() eine DOMNodeList einem Array

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

Dies ist die richtige Antwort sein sollte . Es funktioniert und ist sehr einfach. –

+0

Einverstanden. Das ist das Beste. –

+1

Das funktioniert nicht für mich. 'Abfangbarer fataler Fehler: Argument 1, das an iterator_to_array() übergeben wird, muss die Schnittstelle Traversable implementieren, Instanz der angegebenen DOMNodeList ' –

0

Vorausgesetzt, dass Sie die aktuellen Werte umwandeln möchten und nicht ein Array von DOM zu erstellen Knoten:

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