Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > PHP > PHP-Programmierung > Referenz auf ein Array ohne mein Wissen?
Antwort
 
Themen-Optionen
Alt 12.09.2007, 13:22   Nach oben    #1
ex³
Erfahrener Benutzer
 
Registriert seit: 30.10.2005
Beiträge: 274
Standard Referenz auf ein Array ohne mein Wissen?

Ganz easy. Eine XML Datei wird eingelesen und der inhalt eines Elementes wird verändert. Warum wird aber das XML Element in $export verändert obwohl ich $page->revision->timestamp ändere? Foreach kopiert doch $export-> zu $page warum ändert sich dann der Timestamp in $export? Normalerweise würde ich das geänderte Element ja wieder $export zurückgeben ungefähr so: $export[$key]->page->revision->timestamp

Ist da irgendwie eine Referenz oder sowas? Gut läuft zwar wie ich will aber ich würde doch den Hintergrund gern wissen


PHP-Code:
$export simplexml_load_file('old.xml');

foreach (
$export->page as $page) {
    
$page->revision->timestamp date('Y-m-d') . 'T' date('H:i:s'time() - 60 60) . 'Z';
}

$export->asXML(); 
ex³ ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.09.2007, 13:30   Nach oben    #2
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.583
Standard

Hi,
habe ich mir selbst noch keine Gedanken drüber gemacht, abe das Manual sagt ja
Zitat:
Note: Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself. Therefore, the array pointer is not modified as with the each() construct, and changes to the array element returned are not reflected in the original array. However, the internal pointer of the original array is advanced with the processing of the array. Assuming the foreach loop runs to completion, the array's internal pointer will be at the end of the array.
Quelle: http://de3.php.net/manual/en/control...es.foreach.php

Ist das nun schon die Erklärung?
Also quasi, dass das $page in deinem Fall nur eine Referenz auf das entsprechende Array-Element ist? Klingt ja irgendwie auch logisch!
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.09.2007, 15:15   Nach oben    #3
MrNiceGuy
Erfahrener Benutzer
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 621
Standard

Dürfte es nicht sein. Es wird doch geschrieben, dass foreach mit einer Kopie des Original-Arrays arbeitet und das originale Array nicht angefasst wird. Es müssten also auch alle Referenzen in der Kopie auf die Kopie zeigen und nicht auf das Original... Hmm... Ich hatte so eine Situation leider noch nicht.
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.09.2007, 15:19   Nach oben    #4
dejan_spasic
Erfahrener Benutzer
 
Benutzerbild von dejan_spasic
 
Registriert seit: 05.01.2006
Ort: Düsseldorf
Beiträge: 168
Standard

Zitat:
Zitat von ex³ Beitrag anzeigen
Foreach kopiert doch $export-> zu $page warum ändert sich dann der Timestamp in $export? Normalerweise würde ich das geänderte Element ja wieder $export zurückgeben ungefähr so: $export[$key]->page->revision->timestamp

Ist da irgendwie eine Referenz oder sowas? Gut läuft zwar wie ich will aber ich würde doch den Hintergrund gern wissen
Foreach kopiert ein Array das ist richtig. Nur, $export ist kein Array, sondern ein Objekt das die Traversable implementiert und somit z.B. über foreach iteriert werden kann.
PHP-Code:
$sx = new SimpleXMLElement($xmlstr);

ReflectionObject::export($sx); 
Gibt aus.
Code:
Class [ <internal:SimpleXML> <iterateable> class SimpleXMLElement implements Traversable ] {

  - Constants [0] {
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [0] {
  }

  - Methods [12] {
    Method [ <internal, ctor> final public method __construct ] {
    }

    Method [ <internal> public method asXML ] {
    }

    Method [ <internal> public method saveXML ] {
    }

    Method [ <internal> public method xpath ] {
    }

    Method [ <internal> public method registerXPathNamespace ] {
    }

    Method [ <internal> public method attributes ] {
    }

    Method [ <internal> public method children ] {
    }

    Method [ <internal> public method getNamespaces ] {
    }

    Method [ <internal> public method getDocNamespaces ] {
    }

    Method [ <internal> public method getName ] {
    }

    Method [ <internal> public method addChild ] {
    }

    Method [ <internal> public method addAttribute ] {
    }
  }
}
Wenn man eine Kopie haben möchte, kann man ja auch das Schlüsselwort clone einsetzen.
PHP-Code:
$csx = clone $sx
__________________
Da wir alle in einem Boot sitzen, ist es gut, dass wir nicht alle auf einer Seite stehen... (mir unbekannt)
dejan_spasic ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.09.2007, 18:26   Nach oben    #5
ex³
Erfahrener Benutzer
 
Registriert seit: 30.10.2005
Beiträge: 274
Standard

Also liegt es daran das $export dieses traversable Interface hat und $page dadurch beim foreach (ausnahmsweise) keine Kopie ist sonder referenziert wird?
ex³ ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.09.2007, 18:57   Nach oben    #6
dejan_spasic
Erfahrener Benutzer
 
Benutzerbild von dejan_spasic
 
Registriert seit: 05.01.2006
Ort: Düsseldorf
Beiträge: 168
Standard

Zitat:
Zitat von ex³ Beitrag anzeigen
Also liegt es daran das $export dieses traversable Interface hat und $page dadurch beim foreach (ausnahmsweise) keine Kopie ist sonder referenziert wird?
$page ist ebenfalls ein Objekt vom Typ SimpleXMLElement. Stichwort
Composite Patterns. Und ja genau, die Iteration durch die Elemente wird
über die Implementierung vom Traversable gewährleistet bzw. in diesem Fall
über SimpleXMLIterator -habe ich gerade eben festellen müssen-.
__________________
Da wir alle in einem Boot sitzen, ist es gut, dass wir nicht alle auf einer Seite stehen... (mir unbekannt)
dejan_spasic ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zugriff auf Konfiguration im verschachtelten Array Ben PHP-Programmierung 5 02.02.2007 12:47
Suche Hilfe: Angebot und Nachfrage berechnen ljungi Plauderecke 6 17.12.2006 22:10
[PHP] FTP-Funktionen in PHP nutzen MrNiceGuy Tutorials 0 24.05.2006 14:18
Array in Bezug auf ein anderes sortieren... code5 PHP-Programmierung 2 15.05.2006 15:56
mit foreach schleife auf 4 fach verschachteltes Array zugreifen Doggi PHP-Programmierung 4 01.02.2006 15:45


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:06 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.7.2, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.0.0) und vBSEO.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44