Ankündigung

Einklappen
Keine Ankündigung bisher.

XML Datei mit variabler Länge in ein Array schreiben

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • XML Datei mit variabler Länge in ein Array schreiben

    Hallo zusammen,

    ich habe ein Problem beim Auswerten einer XML-Datei mittels PHP.
    Mittels einer foreach-Schleife schreibe ich die Daten in ein Array, das klappt auch ganz gut. Allerdings habe ich das Problem, dass <notdienste> manchmal 3 Sub-Einträge hat und manchmal 10. Ich würde das ganze mittels einer for-Zählschleife lösen for($i = 0; $i <= $count($apotheke->notdienste->termin; $++)

    Allerdings kann ich die for-Schleife nicht ins Array schreiben.
    Habt ihr eine Idee?

    Vielen Dank für eure Hilfe

    Code:
    <apotheke id="100001" lak="akb">
        <aponet>akb100001</aponet>
        <name>Apotheke Alt Buckow</name>
        <strasse>Alt-Buckow 9 - 11</strasse>
        <plz>12349</plz>
        <ort>Berlin</ort>
        <telefon>030 6259026</telefon>
        <notdienste>
          <termin id="257960125" startdatum="27.01.2015" startzeit="09:00" enddatum="28.01.2015" endzeit="08:55"/>
          <termin id="257960122" startdatum="23.02.2015" startzeit="09:00" enddatum="24.02.2015" endzeit="08:55"/>
          <termin id="" startdatum="22.03.2015" startzeit="09:00" enddatum="23.03.2015" endzeit="08:55"/>
        </notdienste>
      <lat>0</lat><lng>0</lng></apotheke>
    PHP-Code:
    $xmlFile 'file.xml';


    if (
    file_exists($xmlFile)) 
    {
            
    $xml simplexml_load_file($xmlFile);

                    foreach ( 
    $xml->apotheke as $apotheke)
                    {
                                    
    $ausgabe[] = array(
                                    
    "Name" => strval($apotheke->name),
                                    
    "Straße" => strval($apotheke->strasse),
                                    
    "PLZ" => strval($apotheke->plz),
                                    
    "Stadt" => strval($apotheke->ort),
                                    
    "Telefon" => strval($apotheke->phone),
                                    
    "Latitude" => floatval($apotheke->lat),
                                    
    "Longitude" => floatval($apotheke->lng),
                                    );
                     }
            } else {
                    exit(
    "Datei $xmlFile kann nicht geöffnet werden.");



  • #2
    bin mit simplexml nicht fit, aber geht da nicht:
    PHP-Code:
    foreach ($apotheke->notdienst->termin as $termin) { } 

    Kommentar


    • #3
      Zitat von moma Beitrag anzeigen
      bin mit simplexml nicht fit, aber geht da nicht:
      PHP-Code:
      foreach ($apotheke->notdienst->termin as $termin) { } 
      Das hab ich ausprobiert, leider muss ich zuerst das Array schließen, sonst funktioniert das leider nicht.

      Kommentar


      • #4
        http://php.net/manual/de/function.end.php ?

        Kommentar


        • #5
          Zitat von phculo Beitrag anzeigen
          Das hab ich ausprobiert, leider muss ich zuerst das Array schließen, sonst funktioniert das leider nicht.

          Innerhalb eines Arrays kannst du wohl schlecht eine foreach-Schleife ausführen. Mach das doch vorher und speicher das in ein extra Array oder bau dir ein String zusammen.
          PHP-Klassen auf github

          Kommentar


          • #6
            Sorry, dass ich mich lange nicht gemeldet habe, aber ich hatte keine Zeit.

            Leider ist das Problem noch nicht erledigt, mit end() bin ich leider auch nicht weiter gekommen.

            Habt ihr noch eine Idee?

            Kommentar


            • #7
              Jo, lies auch jspits Post.
              PHP-Code:
              foreach ($xml->apotheke as $apotheke) {
                  foreach (
              $apotheke->notdienst->termin as $termin) {
                      
              // ...
                  
              }
                  
              $ausgabe[] = array(
                      
              "Name" => strval($apotheke->name),
                      
              "Straße" => strval($apotheke->strasse),
                      
              "PLZ" => strval($apotheke->plz),
                      
              "Stadt" => strval($apotheke->ort),
                      
              "Telefon" => strval($apotheke->phone),
                      
              "Latitude" => floatval($apotheke->lat),
                      
              "Longitude" => floatval($apotheke->lng),
                  );

              Relax, you're doing fine.
              RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

              Kommentar


              • #8
                Hi,

                ich hab nun eine zusätzliche foreach-Schleife eingebaut, allerdings wird nun nur der 1. Termin aufgenommen, nicht alle zusätzlichen.
                Hab ich irgendwo einen Denkfehler?

                Vielen Dank schonmal!

                PHP-Code:
                foreach ( $xml->apotheke as $apotheke)
                            {
                                foreach (
                $xml->apotheke->notdienste->termin as $termin)
                                {
                                    
                $termin[] = $termin->attributes();
                                }
                                
                $lat2 floatval($apotheke->lat);
                                
                $lon2 floatval($apotheke->lng);
                                
                $entfernung distance($lat1$lon1$lat2$lon2"K");
                                if (
                $entfernung $umkreis) {
                                    
                $ausgabe[] = array(
                                    
                "Name" => strval($apotheke->name),
                                    
                "Strasse" => strval($apotheke->strasse),
                                    
                "PLZ" => strval($apotheke->plz),
                                    
                "Stadt" => strval($apotheke->ort),
                                    
                "Telefon" => strval($apotheke->telefon),
                                    
                "Entfernung" => distance($lat1$lon1$lat2$lon2"K"),
                                    
                "Latitude" => floatval($apotheke->lat),
                                    
                "Longitude" => floatval($apotheke->lng),
                                    
                "Notdienste" => $termin,
                                    
                //"Notdienst" => $apotheke->notdienste->termin->attributes(),
                                
                ) ;
                            } 

                Kommentar


                • #9
                  Du überschreibst $termin... nenn die variable anders.
                  Current Projects: http://www.welten-buch.de, http://neu.zooadoo.de

                  Kommentar


                  • #10
                    Guter Einwand

                    Allerdings bekomme ich jetzt bei jedem Eintrag 4x die gleichen Attribute.

                    Kommentar


                    • #11
                      Na dann änders so, dass du's nicht mehr bekommst.

                      Mit mehr Ernst:
                      "Eintrag" ist was? Welche Attribute?
                      Gib am besten eine XML und beschreib was für ein Ergebnis du haben willst.
                      Dazu dann noch deinen aktuellen Code.
                      Sonst ist artet das nur in ein Ratespiel aus.
                      Relax, you're doing fine.
                      RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

                      Kommentar


                      • #12
                        In meinem ersten Posting habe ich ein Beispiel für einen XML-Node und meinen aktuellen Code gepostet.

                        Ich möchte jeden Knoten, der einen aktuell gültigen Termin hat in ein Array schreiben.

                        Beispielsweise: Heute ist 02.03.2015 19:16 Uhr. Also sollen alle Apotheken die momentan Notdienst haben in ein Array geschrieben werden und zusätzlich die Uhrzeiten, also z.B. von 02.03.2015 09:00 bis 03.03.2015 08:55.

                        Code:
                        <apotheke id="100001" lak="akb">
                            <aponet>akb100001</aponet>
                            <name>Apotheke Alt Buckow</name>
                            <strasse>Alt-Buckow 9 - 11</strasse>
                            <plz>12349</plz>
                            <ort>Berlin</ort>
                            <telefon>030 6259026</telefon>
                            <notdienste>
                              <termin id="257960125" startdatum="27.01.2015" startzeit="09:00" enddatum="28.01.2015" endzeit="08:55"/>
                              <termin id="257960122" startdatum="23.02.2015" startzeit="09:00" enddatum="24.02.2015" endzeit="08:55"/>
                              <termin id="" startdatum="22.03.2015" startzeit="09:00" enddatum="23.03.2015" endzeit="08:55"/>
                            </notdienste>
                          <lat>0</lat><lng>0</lng></apotheke>
                        PHP-Code:
                        $xmlFile 'file.xml';


                        if (
                        file_exists($xmlFile)) 
                        {
                                
                        $xml simplexml_load_file($xmlFile);

                                        foreach ( 
                        $xml->apotheke as $apotheke)
                                        {
                                                        
                        $ausgabe[] = array(
                                                        
                        "Name" => strval($apotheke->name),
                                                        
                        "Straße" => strval($apotheke->strasse),
                                                        
                        "PLZ" => strval($apotheke->plz),
                                                        
                        "Stadt" => strval($apotheke->ort),
                                                        
                        "Telefon" => strval($apotheke->phone),
                                                        
                        "Latitude" => floatval($apotheke->lat),
                                                        
                        "Longitude" => floatval($apotheke->lng),
                                                        );
                                         }
                                } else {
                                        exit(
                        "Datei $xmlFile kann nicht geöffnet werden.");

                        [/QUOTE]

                        Kommentar


                        • #13
                          Das Termine Element fehlt ja in deinem Ansatz na noch komplett.
                          Bau eine Schleife duch alle apotheke-Elemente und eine zweite aller termin-Elemente innerhalb. Wenn dann ein Termin im Vergleich mit dem aktuellem Zeitpunk zutrifft, dann machst du mit dem aktuellem apotheke-Element aus der Äußeren Schleife und der aktuellen inneren elemente was du willst, hier in ein Array geben.

                          Woran scheiterts genau, an dem Zugriff auf die Elemente/Attribute? Ansatz:

                          PHP-Code:
                          $str '
                          <root>
                          <apotheke id="100001" lak="akb">
                              <aponet>akb100001</aponet>
                              <name>Apotheke Alt Buckow</name>
                              <strasse>Alt-Buckow 9 - 11</strasse>
                              <plz>12349</plz>
                              <ort>Berlin</ort>
                              <telefon>030 6259026</telefon>
                              <notdienste>
                                <termin id="257960125" startdatum="27.01.2015" startzeit="09:00" enddatum="28.01.2015" endzeit="08:55"/>
                                <termin id="257960122" startdatum="23.02.2015" startzeit="09:00" enddatum="24.02.2015" endzeit="08:55"/>
                                <termin id="" startdatum="22.03.2015" startzeit="09:00" enddatum="23.03.2015" endzeit="08:55"/>
                              </notdienste>
                            <lat>0</lat><lng>0</lng>
                          </apotheke>
                          </root>'
                          ;

                          $xml simplexml_load_string($str);

                          foreach (
                          $xml->apotheke as $apotheke) {

                              echo 
                          "<b>".$apotheke->name."</b><br>";    

                              foreach(
                          $apotheke->notdienste->termin as $termin) {
                                 echo 
                          $termin["startdatum"]."<br>";
                                 echo 
                          $termin["startzeit"]."<br>";
                                 echo 
                          $termin["enddatum"]."<br>";
                                 echo 
                          $termin["endzeit"]."<br>";
                              }

                          Ausgabe:
                          Apotheke Alt Buckow
                          27.01.2015
                          09:00
                          28.01.2015
                          08:55
                          23.02.2015
                          09:00
                          24.02.2015
                          08:55
                          22.03.2015
                          09:00
                          23.03.2015
                          08:55
                          Ich denk den Rest bekommst selbst hin?!
                          Zum Datumsvergleich siehe zB hier als Ansatz: http://php-de.github.io/jumpto/datetime/#vergleiche
                          Und: print_r() ist dein Freund!

                          LG
                          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                          PHP.de Wissenssammlung | Kein Support per PN

                          Kommentar


                          • #14
                            Vielen Dank,

                            den Rest bekomm ich hoffentlich selber hin, aber ich hab jetzt verstanden wo mein Denkfehler war

                            Vielen Dank für die Hilfe! )

                            Kommentar

                            Lädt...
                            X