ERLEDIGT
JA
JA
ANTWORTEN
8
8
ZUGRIFFE
1758
1758
EMPFEHLEN
-
Ich lasse mit einer foreach Schleife die Tags in einem XML-Objekt ausgeben.
Bsp.
Code xml:1 2 3 4 5 6 7 8 9 10 11 12 13 14
<xml> <mitarb> <vorname>Axel</vorname> <nachname>Ammeran</nachname> </mitarb> <mitarb> <vorname>Axel</vorname> <nachname>Anderson</nachname> </mitarb> <mitarb> <vorname>Berta</vorname> <nachname>Finke</nachname> </mitarb> </xml>
Ich lasse meine foreach Schleife durch diese XML Datei durchlaufen:
Nun würde ich gern in die foreach Schleife die prev() und next() Funktionen einbauen, damit ich beliebig den Zeiger positioneren kann. Leider gehen die Funktionen prev() und next() nicht im foreach Konstrukt.PHP-Code:$xml=simplexml_load_file("123.xml");
foreach($xml->xpath("/xml/mitarb") as $werte){
echo $werte->vorname." ";
echo $werte->nachname."<br />";
}
Auf der PHP Seite las ich, dass in foreach mit einer Kopie eines Arrays gearbeitet wird, aber wie kann, auch über Umwege, mit prev und next arbeiten (vor allem im Beispiel mit XML-Objekten).
Vielen Dank für Anregungen aus der schwierigen Lage.
-
10.01.08 19:14 #2
- Registriert seit
- Dec 2007
- Ort
- Bremen
- Beiträge
- 3.418
Hi,
beschreib doch mal, was Du eigentlich erreichen willst. Kann ich mir jetzt gerade nicht vorstellen.
LG
-
Es handelt sich dabei um ein Problem in MusicXML Dateien. Ich versuche es wie folgt zu verdeutlichen:
Code xml: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
<xml> <einfamilienhaus id="1"> <personen> <vorname>Axel</vorname> <nachname>Armon</nachname> </personen> <personen> <vorname>Berta</vorname> <nachname>Becker</nachname> <untermieter /> </personen> <personen> <vorname>Claudia</vorname> <nachname>Chuck</nachname> <untermieter /> </personen> </einfamilienhaus> <einfamilienhaus id="2"> <personen> <vorname>Dora</vorname> <nachname>Dose</nachname> </personen> <personen> <vorname>Emil</vorname> <nachname>Egger</nachname> <untermieter /> </personen> <personen> <vorname>Farian</vorname> <nachname>Feminin</nachname> <untermieter /> </personen> </einfamilienhaus> ... </xml>
Beschreibung: Es gibt einen Besitzer eines Hauses. Er steht im tag <einfamilienhaus> als <person> an erster Stelle. Hat dieser Besitzer weitere Mit- und Untermieter, dann bekommen diese Personen das leere Element <untermieter />.
Eigentliches Ziel ist es nun alle Personenkombinationen von einfamilienhaus id(1) und einfamilienhaus id(2) zu finden.
Mein Code zum auslesen würde so gehen:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
if(<personen>[n+1] hat Tag <untermieter />){ while(<personen>[n+x] hat Tag <untermieter />){ -merke dir die Schleifendurchläufe in s } } if(<personen>[n+s+1] hat Tag <untermieter />){ while(<personen>[(n+s+1)+y] hat Tag <untermieter />){ -merke dir die Schleifendurchläufe in t } } if(isset(s) und isset(t)){ for(n bis n+s-1){ for(n+s bis n+s+t-1){ -bilde Kombination von personen aus haus id(1) mit haus id(2) } } }
Ab hier soll dann ab Position n+s weitergelesen werden, da in einfamilienhaus id(3) ja auch wieder Personen leben, mit denen die Kombinationen mit id(2) gebildet werden müssen.Geändert von NTDY (11.01.08 um 09:20 Uhr)
-
10.01.08 20:03 #4
- Registriert seit
- Dec 2007
- Ort
- Bremen
- Beiträge
- 3.418
Ähh... sorry aber...

Kansst Du mal ein Beispiel geben, was da rauskommen soll? So als Ergebnis?
LG
-
Ergebnis alle Kombination von id(1) mit id(2):
Code :1 2 3 4 5 6 7 8 9 10 11
Axel Armon - Dora Dose Axel Armon - Emil Egger Axel Armon - Farian Feminin Berta Becker - Dora Dose Berta Becker - Emil Egger Berta Becker - Farian Feminin Claudia Chuck - Dora Dose Claudia Chuck - Emil Egger Claudia Chuck - Farian Feminin
Und dann im kommenden Schritt id(2) mit id(3):
Es kann aber auch mal sein, dass es gar keine Untermieter gibt, oder auch mal 5 oder 6. In meinem Bsp. habe ich in id(1) und id(2) jeweils nur 2 Untermieter genommen.
-
10.01.08 20:39 #6
- Registriert seit
- Dec 2007
- Ort
- Bremen
- Beiträge
- 3.418
Hi,
und auch noch id(1) mit id(3) usw.? Da könntest Du nach einem Algorithmus für Permutationen suchen. Ich hoffe, es handelt sich nicht um große Datenmengen, das kann Deinen Server zum Rauchen bringen.
Also, wenn ich Dich richtig verstehe, möchtest Du die Schleifen so schachteln, dass die innere immer auf das nächste Einfamilienhaus zugreift?
In foreach funktionieren next() und prev() aus genannten Gründen nicht, wohl aber in each()
Müsste also bei
while (list($key, $val) = each($array))
gehen.
LG
-
Es handelt sich glückerlicherweise nur um n -> n+1 Kombinationen.
Ich habe den Code
auch schon probiert, aber er bleibt immer beim ersten Datensatz und macht eine Endlosschleife. Auch ein next($xml) in der foreach Schleife hilft nicht. Kann es damit zusammenhängen, dass $xml eigentlich ein XML-Objekt ist und nicht als Array benutzt werden kann? Welche Auswege habe ich nun?PHP-Code:<?php
$xml=simplexml_load_file("123.xml");
//foreach($xml->xpath("/xml/mitarb") as $werte){
reset ($xml);
while (list(, $werte) = each($xml->xpath("/xml/mitarb"))) {
echo $werte->vorname." ";
echo $werte->nachname."<br />";
}
?>
-
11.01.08 00:54 #8
- Registriert seit
- Dec 2007
- Ort
- Bremen
- Beiträge
- 3.418
Hi,
Hatte inzwischen etwas Zeit und Dein Problem mittlerweile verstanden (hoffe ich). Das ist doch recht einfach zu lösen:Es handelt sich glückerlicherweise nur um n -> n+1 Kombinationen.
Suchst Du das? Ich glaube, dein einziges Problem war, dass Du nicht an die Variante foreach($array as $key => $value) gedacht hast?PHP-Code:$a = array("Axel", "Berta", "Claudia");
$b = array("Dora", "Emil", "Farian");
$c = array("Gustav", "Heinrich", "Ida");
$komplett = array($a, $b, $c);
foreach($komplett as $key => $value) {
foreach($value as $k1 => $v1) {
if(array_key_exists($key + 1, $komplett)) {
foreach($komplett[$key + 1] as $v2) {
echo $v1 . " ". $v2 . "<br/>";
}
}
}
}
Die xpath()-Methode liefert schon ein Array zurück, allerdings ein Array von simpleXMLElement-Objekten. D.h. in einer foreach-Schleife ist der $value wieder ein Objekt. Obiger Algorithmus sähe für Dein Häuserbeispiel folgendermaßen aus:
Hoffe, das hilft Dir weiter.PHP-Code:$haeuser = $xml->xpath('/xml/einfamilienhaus');
foreach($haeuser as $key => $value) {
foreach($value->xpath('personen') as $k1 => $v1) {
if(array_key_exists($key + 1, $haeuser)) {
foreach($haeuser[$key + 1]->xpath('personen') as $v2) {
echo $v1->vorname . " ". $v1->nachname . " - " . $v2->vorname . " " . $v2->nachname . "<br/>";
}
}
}
}
LG
-
Na das ist ja der Hammer. Es funktioniert wunderbar. Vielen vielen lieben Dank. Diplomarbeit kann jetzt doch wieder gerettet werden.
Keywords für die Suche: SimpleXML, foreach, vorlaufen, überspringen
Ähnliche Themen
-
Foreach
Von Sasser im Forum PHPAntworten: 3Letzter Beitrag: 23.06.08, 08:28 -
Vor und zurück bewegen
Von FipsTheThief im Forum PHPAntworten: 2Letzter Beitrag: 17.09.05, 14:57 -
foreach
Von Dr_Google im Forum PHPAntworten: 2Letzter Beitrag: 23.06.05, 14:10 -
foreach()
Von Comenius im Forum PHPAntworten: 11Letzter Beitrag: 10.06.05, 18:51 -
Foreach
Von Maximus im Forum PHPAntworten: 3Letzter Beitrag: 29.05.02, 10:40





Zitieren
Login






[PHP][Snippet] Array zu XML konvertieren