tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
1758
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    NTDY NTDY ist offline Mitglied Gold
    Registriert seit
    Mar 2004
    Ort
    no-comment
    Beiträge
    136
    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:
    PHP-Code:
    $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.
     

  2. #2
    kuddeldaddeldu kuddeldaddeldu ist offline Mitglied Diamant
    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
     

  3. #3
    NTDY NTDY ist offline Mitglied Gold
    Registriert seit
    Mar 2004
    Ort
    no-comment
    Beiträge
    136
    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)
     

  4. #4
    kuddeldaddeldu kuddeldaddeldu ist offline Mitglied Diamant
    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
     

  5. #5
    NTDY NTDY ist offline Mitglied Gold
    Registriert seit
    Mar 2004
    Ort
    no-comment
    Beiträge
    136
    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.
     

  6. #6
    kuddeldaddeldu kuddeldaddeldu ist offline Mitglied Diamant
    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
     

  7. #7
    NTDY NTDY ist offline Mitglied Gold
    Registriert seit
    Mar 2004
    Ort
    no-comment
    Beiträge
    136
    Es handelt sich glückerlicherweise nur um n -> n+1 Kombinationen.
    Ich habe den Code
    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 />";  
    }
    ?>
    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?
     

  8. #8
    kuddeldaddeldu kuddeldaddeldu ist offline Mitglied Diamant
    Registriert seit
    Dec 2007
    Ort
    Bremen
    Beiträge
    3.418
    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-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/>";
             }
          }
       }

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

    Hoffe, das hilft Dir weiter.

    LG
     

  9. #9
    NTDY NTDY ist offline Mitglied Gold
    Registriert seit
    Mar 2004
    Ort
    no-comment
    Beiträge
    136
    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

  1. Foreach
    Von Sasser im Forum PHP
    Antworten: 3
    Letzter Beitrag: 23.06.08, 08:28
  2. Vor und zurück bewegen
    Von FipsTheThief im Forum PHP
    Antworten: 2
    Letzter Beitrag: 17.09.05, 14:57
  3. foreach
    Von Dr_Google im Forum PHP
    Antworten: 2
    Letzter Beitrag: 23.06.05, 14:10
  4. foreach()
    Von Comenius im Forum PHP
    Antworten: 11
    Letzter Beitrag: 10.06.05, 18:51
  5. Foreach
    Von Maximus im Forum PHP
    Antworten: 3
    Letzter Beitrag: 29.05.02, 10:40