Nodes vergleichen
Paul
- xml
Per XPath suche ich mir eine Nodelist zusammen:
$felderNodeList = $xpath->query('//*[@feld="true"]');
NodeList in Array umspeichern (http://php.net/manual/de/class.domnodelist.php; suchen nach 'use an array'):
foreach ($felderNodeList as $node) {
$felder[] = $node;
}
Die einzelnen Arrayelemente von $felder sind objects (echo gettype($felder[1]);)
Nun liefern folgende Abfragen die selben Ergebnisse:
if (in_array($node->nodeName, $felder)) {
und
foreach($felder as $feld) {
if($node->isSameNode($feld)) {
Hätte gedacht, nur das zweite Beispiel ist korrekt. Beim ersten schaut man doch nach, ob ein String in einem Array mit Objekten ist ... ? Warum wird auch beim ersten Beispiel das richtige gefunden?
Paul
Hi,
Nun liefern folgende Abfragen die selben Ergebnisse:
if (in_array($node->nodeName, $felder)) {
und
foreach($felder as $feld) {
if($node->isSameNode($feld)) {
>
>
> Hätte gedacht, nur das zweite Beispiel ist korrekt. Beim ersten schaut man doch nach, ob ein String in einem Array mit Objekten ist ... ? Warum wird auch beim ersten Beispiel das richtige gefunden?
Dass in\_array zwingend Stringvergleiche macht, finde ich im Manual nicht explizit erwähnt.
Aber wenn man davon ausgeht, dann ist klar, dass ein Objekt erst mal in einen String umgewandelt werden muss, bevor es verglichen werden kann.
Und dabei kommt es dann darauf an, ob/wie die magische Methode [__toString](http://www.php.net/manual/en/language.oop5.magic.php#language.oop5.magic.tostring) implementiert ist.
Wenn die bei DOMNodes bspw. nur den Textinhalt eines Knotens als String zurückliefert - dann können mehrere verschiedene Nodes „gleich“ sein; bzw. genauso gut kann sich in einem ungünstigen Test-Case herausstellen, dass es damit vermeintlich wie gewünscht funktioniert.
MfG ChrisB
--
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
... dann können mehrere verschiedene Nodes „gleich“ sein; bzw. genauso gut kann sich in einem ungünstigen Test-Case herausstellen, dass es damit vermeintlich wie gewünscht funktioniert.
Also ist die Schleife doch die bessere Wahl. Vielen Dank!