In foreach den Arrayzeiger vor- und zurück bewegen

NTDY

Erfahrenes Mitglied
Ich lasse mit einer foreach Schleife die Tags in einem XML-Objekt ausgeben.
Bsp.
XML:
<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:
PHP:
$xml=simplexml_load_file("123.xml");
foreach($xml->xpath("/xml/mitarb") as $werte){
  echo $werte->vorname." ";
  echo $werte->nachname."<br />";  
}

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.
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.
 
Zuletzt bearbeitet von einem Moderator:
Es handelt sich dabei um ein Problem in MusicXML Dateien. Ich versuche es wie folgt zu verdeutlichen:
XML:
<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:
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.
 
Zuletzt bearbeitet von einem Moderator:
Ergebnis alle Kombination von id(1) mit id(2):
Code:
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.
 
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
PHP:
<?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 />";  
}
?>
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?
 
Hi,

Es handelt sich glückerlicherweise nur um n -> n+1 Kombinationen.
Hatte inzwischen etwas Zeit und Dein Problem mittlerweile verstanden (hoffe ich). Das ist doch recht einfach zu lösen:

PHP:
$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/>";
         }
      }
   }
}

Suchst Du das? Ich glaube, dein einziges Problem war, dass Du nicht an die Variante foreach($array as $key => $value) gedacht hast?
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:

PHP:
$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/>";
         }
      }
   }
}

Hoffe, das hilft Dir weiter.

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
 
Zurück