Ankündigung

Einklappen
Keine Ankündigung bisher.

CSV auslesen und Einträge gruppiert ausgeben

Einklappen

Neue Werbung 2019

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

  • CSV auslesen und Einträge gruppiert ausgeben

    Hi zusammen,
    vorerst: ich bin PHP-Anfänger, daher bitte ich um Verständnis, wenn ich "seltsame" Fragen stelle

    Ich hab ein CSV, dass ich bereits in mein PHP File einlese, anpasse und mit if Abfragen gruppiert als echo ausgebe.
    Ich will die einzelnen Elemente gruppiert ausgeben (mit eigener Headline). Also zuerst alle Einträge mit Adresse "Linz" und Position "Service", dann alle mit Adresse "Salzburg" und Position "Service",...
    Ich hab das zwar jetzt gelöst, aber umständlich und ich bin mir sicher es muss eine schönere Lösung geben als jedes mal die .csv neu reinzuladen...
    Danke für eure Unterstützung!

    PHP-Code:
        <h2> Linz </h2>
        <h3> Service </h3>

            <?php

            $handle 
    fopen ("visitenkartenliste.csv","r");
            
    $row 1;


            while (
    $data fgetcsv ($handle1000";")) {
                    if(
    $row <=  2){ $row++; continue; } //exclude first 2 rows
                    
    $data array_map("utf8_encode"$data); //added
                    
    $num count ($data);           

                    
    $title $data[1];
                    
    $firstname $data[2];
                    
    $surname $data[3];
                    
    $position $data[4];
                    
    $position_en $data[5];
                    
    $address $data[6];
                    
    $telephone $data[7];
                    
    $mobile $data[8];
                    
    $email $data[9];
                    
    $id $data[11];

                    
    $encodePosition str_replace('\n'''$position); //delete special sign in csv


                    
    $umlaute = array("ä""ü""ö""ß""-"" ""."); //change signs
                    
    $encode = array("ae""ue""oe""ss""""""_"); //to

                    
    $encodeFirstname str_replace($umlaute$encode$firstname); 
                    
    $encodeSurname str_replace($umlaute$encode$surname);

                    
    $image "/images/" $encodeSurname "_" $encodeFirstname ".jpg"//get file name for image



                    
    if (strpos($address,'Linz') !== false && strpos($position,'Service') !== false) { //only show "Linz" & "Service"
                        
    echo 

                        
    "<div class='entry'>" .
                            
    "<div class='image' style='background-image: url("$image"); background-color: #efefef;'> </div><div class='text'>" .
                            
    "<h3>"$title " " $firstname " " $surname "</h3>".
                            
    "</br> " $encodePosition 
                            
    "</br> " $address 
                            
    "</br> <a class='tel' href='tel:$telephone'> "  $telephone "</a>" .
                            
    "</br> <a class='tel' href='tel:$mobile'> " $mobile "</a>" .
                            
    "</br> <a class='link' href='mailto: $email'>" $email "</a>" .
                        
    "</div></div>";
                    }
            } 

            
    ?>
        <div class="clear"></div>    
        <h2> Salzburg</h2>    
        <h3> Service </h3>


        <?php

            $handle 
    fopen ("visitenkartenliste.csv","r");
            
    $row 1;


            while (
    $data fgetcsv ($handle1000";")) {
                    if(
    $row <=  2){ $row++; continue; } //exclude first 2 rows
                    
    $data array_map("utf8_encode"$data); 
                    
    $num count ($data);           

                    
    $title $data[1];
                    
    $firstname $data[2];
                    
    $surname $data[3];
                    
    $position $data[4];
                    
    $position_en $data[5];
                    
    $address $data[6];
                    
    $telephone $data[7];
                    
    $mobile $data[8];
                    
    $email $data[9];
                    
    $id $data[11];

                    
    $encodePosition str_replace('\n'''$position); //delete special sign in csv


                    
    $umlaute = array("ä""ü""ö""ß""-"" ""."); //change signs
                    
    $encode = array("ae""ue""oe""ss""""""_"); //to

                    
    $encodeFirstname str_replace($umlaute$encode$firstname); 
                    
    $encodeSurname str_replace($umlaute$encode$surname);

                    
    $image "/images/" $encodeSurname "_" $encodeFirstname ".jpg"//get file name for image

                    
    if (strpos($address,'Salzburg') !== false && strpos($position,'Service') !== false) {  //only show "Salburg" & "Service"
                        
    echo 

                        
    "<div class='entry'>" .
                            
    "<div class='image' style='background-image: url("$image"); background-color: #efefef;'> </div><div class='text'>" .
                            
    "<h3>"$title " " $firstname " " $surname "</h3>".
                            
    "</br> " $encodePosition 
                            
    "</br> " $address 
                            
    "</br> <a class='tel' href='tel:$telephone'> "  $telephone "</a>" .
                            
    "</br> <a class='tel' href='tel:$mobile'> " $mobile "</a>" .
                            
    "</br> <a class='link' href='mailto: $email'>" $email "</a>" .
                        
    "</div></div>";
                    }
            } 

            
    ?>

  • #2
    Auf die Schnelle.. Auslesen, nach dem Feld sortieren und dann mit dem "Gruppenbruch" ausgeben. https://php-de.github.io/jumpto/gruppenbruch/
    The string "()()" is not palindrom but the String "())(" is.

    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


    • #3
      Benutze mehrdimensionale Arrays...
      Du solltest beim Sammeln gleich kategorisieren, anschliessend kannst du ganz bequem auf jede einzelne Sammlung zugreifen.

      Beispiel:
      PHP-Code:
      $address $row[??];
      $position $row[??];
      $result$position ][ $address ][] = $row
      Anschliessend kannst du ganz bequem auf $result[ 'Service' ][ 'Linz' ] zugreifen, um alle Zeilen für "Service/Linz" zu erhalten...
      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

      Kommentar


      • #4
        Ich hab das zwar jetzt gelöst, aber umständlich und ich bin mir sicher es muss eine schönere Lösung geben als jedes mal die .csv neu reinzuladen...
        Ja, gibt es. Einmal einlesen, in eine DB packen und von dort die Daten aufbereitet ausgeben lassen. SQLite bietet sich dafür an.


        Kommentar


        • #5
          Auf die Schnelle.. Auslesen, nach dem Feld sortieren und dann mit dem "Gruppenbruch" ausgeben. https://php-de.github.io/jumpto/gruppenbruch/
          Das wäre spannend, kannst du mir noch helfen, wie ich das in meine while-Schleife reinbekomme?
          Es sollte dann quasi immer eine global Überschrift gestetzt sein und darunter die Elemente die dieser Abfrage zutreffen:

          PHP-Code:
           if (strpos($address,'Salzburg') !== false && strpos($position,'Service') !== false) { 
          Derzeit hab ich das so:

          PHP-Code:
          <h2> Salzburg </h2>
              <h3> Service & Wartung </h3>

                  <?php

                  $handle 
          fopen ("visitenkartenliste.csv","r");
                  
          $row 1;


                  while (
          $data fgetcsv ($handle1000";")) {
                          if(
          $row <=  2){ $row++; continue; } //exclude first 2 rows
                          
          $data array_map("utf8_encode"$data); //added
                          
          $num count ($data);           

                          
          $title $data[1];
                          
          $firstname $data[2];
                          
          $surname $data[3];
                          
          $position $data[4];
                          
          $position_en $data[5];
                          
          $address $data[6];
                          
          $telephone $data[7];
                          
          $mobile $data[8];
                          
          $email $data[9];
                          
          $id $data[11];

                          
          $encodePosition str_replace('\n'''$position); //delete special sign in csv


                          
          $umlaute = array("ä""ü""ö""ß""-"" ""."); //change signs
                          
          $encode = array("ae""ue""oe""ss""""""_"); //to

                          
          $encodeFirstname str_replace($umlaute$encode$firstname); 
                          
          $encodeSurname str_replace($umlaute$encode$surname);

                          
          $image "/images/" $encodeSurname "_" $encodeFirstname ".jpg"//get file name for image

                          
          if (strpos($address,'Salzburg') !== false && strpos($position,'Service') !== false) { 
                              echo 

                              
          "<div class='entry'>" .
                                  
          "<div class='image' style='background-image: url("$image"); background-color: #efefef;'> </div><div class='text'>" ;

                                  if(
          strpos($encodePosition,'Leitung')!== false)
                                      {
                                          echo 
          "<h4 class='green'> $title  $firstname $surname </h4>";
                                      }
                                  else
                                      {
                                          echo 
          " <h4> $title  $firstname $surname </h4>";
                                      }


                              echo                        

                                  
          "</br> " $encodePosition 
                                  
          "</br> <a class='tel' href='tel:$telephone'> "  $telephone "</a>" .
                                  
          "</br> <a class='tel' href='tel:$mobile'> " $mobile "</a>" .
                                  
          "</br> <a class='link' href='mailto: $email'>" $email "</a>" .
                              
          "</div></div>";
                          }
                  } 

                  
          ?>



          Kommentar


          • #6
            Gruppenbruch erfordert eine Sortierung.
            Du brauchst zwei Schleifen (unterschlägt man die Extra-Schleifen fürs Sortieren), eine zum Sammeln, danach wird sortiert, und eine zweite für die Ausgabe.
            Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

            Kommentar


            • #7
              Danke für eure Rückmeldungen, leider merke ich, dass mir das ganze noch zu steil ist...
              Ich komme da leider nicht weiter... Mal sehen, ob mir das vielleicht jemand von den Bekannten genauer erklären kann...

              Ich weiß nicht, wie ich Schleifen richtig verschachtle, ich bin halt wirklich erst am Anfang von php...


              PHP-Code:
               <?php

                      $handle 
              fopen ("daten.csv","r");
                      
              $row 1;

                      while (
              $data fgetcsv ($handle1000";")) {
                              if(
              $row <=  2){ $row++; continue; } //exclude first 2 rows
                              
              $data array_map("utf8_encode"$data); //added
                              
              $num count ($data);           

                              
              $title $data[1];
                              
              $firstname $data[2];
                              
              $surname $data[3];
                              
              $address $data[6];

              //Hier sollte neue Schleife beginnen mit eigener Überschrift
              //echo "<h2> Linz </h2>";                


                              
              if (strpos($address,'Linz') !== false) { 
                                      echo 

                                      
              $title 
                                      
              "</br> " $firstname $surname 
                                      
              "</br> " $address "</br></br> ";    
                              }

              //Hier sollte neue Schleife beginnen mit eigener Überschrift
              //echo "<h2> Salzburg </h2>";

                              
              if (strpos($address,'Salzburg') !== false) { 
                                      echo 

                                      
              $title 
                                      
              "</br> " $firstname $surname 
                                      
              "</br> " $address "</br></br> ";    
                              }                

                      } 
                      
              ?>

              Kommentar


              • #8
                Versuch doch nicht alles auf ein mal und in einem riesigen Codeblock zu lösen, sondern deine Anforderungen von einander zu trennen und in kleinere Aufgaben zu zerlegen. Deine erste Anforderung ist die CSV-Datei zu zerlegen. Deine zweite Anforderung ist, ein 2-dimensionales Array nach bestimmten Schlüsseln zu gruppieren.

                PHP-Code:
                <?php

                $array 
                = [
                    [
                'city' => 'Bremen',   'position' => 'Service''name' => 'Peter'],
                    [
                'city' => 'Bremen',   'position' => 'Marketing''name' => 'Johannes'],
                    [
                'city' => 'Bremen',   'position' => 'Marketing''name' => 'Marlene'],
                    [
                'city' => 'Hannover''position' => 'Service''name' => 'Marie'],
                    [
                'city' => 'Hannover''position' => 'Service''name' => 'Bert'],
                    [
                'city' => 'Hannover''position' => 'Marketing''name' => 'Kevin'],
                    [
                'city' => 'Hamburg',  'position' => 'Marketing''name' => 'Traute'],
                ];
                $grouped = [];

                foreach(
                $array as $item){
                    
                $city $item['city'];
                    
                $position $item['position'];
                    
                $grouped[$city][$position][] = $item;
                }

                print_r($grouped);
                So bleibt dein Code wiederverwendbar, egal wo die Daten herkommen, und du hast deine Logik von der Ausgabe getrennt.

                Das erfordert halt, dass du beim Auslesen ein mal die richtigen Werte für die Gruppierung mit einträgst.
                [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

                Kommentar


                • #9
                  @chorn: Danke, das hat mir geholfen, konnte es nun fertig umsetzen!


                  PHP-Code:
                  <?php


                      
                  // addresses    
                      
                  $austria "Adresse Österreich";
                      
                  $italy "Adresse Italien";

                      
                  // department 
                      
                  $innendienst "12580";
                      
                  $aussendienst "52897";

                      function 
                  csv_to_array($filename='daten.csv'$delimiter=';'){
                              if(!
                  file_exists($filename) || !is_readable($filename))
                                  return 
                  FALSE;

                              
                  $header NULL;
                              
                  $data = array();
                              if ((
                  $handle fopen($filename'r')) !== FALSE)
                              {
                                  while ((
                  $row fgetcsv($handle1000$delimiter)) !== FALSE)
                                  {
                                      if(!
                  $header)
                                          
                  $header $row;
                                      else
                                          {
                                          
                  $row array_map("utf8_encode"$row);
                                          
                  $data[] = array_combine($header$row);
                                          }

                                  }
                                  
                  fclose($handle);
                              }
                              return 
                  $data;    
                      }        


                      function 
                  department ($data$searchaddress$searchdepartment){
                          foreach (
                  $data as &$row) {

                              
                  // name rows     
                              
                  $surname $row["Nachname"];
                              
                  $position $row["Position"];
                              
                  $address $row["Adresse"];
                              
                  $email $row["E-Mail"];
                              
                  $department $row["Abteilung"];

                              if ((
                  $address==$searchaddress) && ($department==$searchdepartment))  {  
                                  echo 
                  $surname  </br> $position </br> $email ";
                              } 
                          }        
                      }                


                      
                  $data csv_to_array('daten.csv');


                      
                  department ($data$austria$innendienst); 


                  ?>

                  Kommentar

                  Lädt...
                  X