Ankündigung

Einklappen
Keine Ankündigung bisher.

Wie leere Zeilen aus Array löschen (array_filter)?

Einklappen

Neue Werbung 2019

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

  • Wie leere Zeilen aus Array löschen (array_filter)?

    Ich habe eine CSV-Datei mit 3 Elementen pro Zeile, wobei manche Zeilen keinen Eintrag haben, Bsp:

    Code:
    No;Spiel;URL
    4;Dragons Lair;http://www.
    ;;
    6;Salamander;http://www.
    Nun möchte ich vor der Ausgabe in eine HTML-Tabelle die leeren Zeilen löschen, was mit array_filter funktionieren soll, das NULL, '' etc. entfernt. Mit diesem Code
    PHP-Code:
    <?php
    $videos
    =file("videos.csv");
    $nonull=array_filter($videos);
    for(
    $i=1;$i<count($nonull);$i++){
      
    $element=explode(";",$nonull[$i]);
       echo 
    "<tr><td>".$element[0]."</td><td>".$element[1]."</td><td>".$element[2]."</td></tr>\n";
      }
     
    ?>
    tauchen aber leider auch die leeren Zeilen in der Tabelle auf. Wo liegt der Fehler? TIA.


  • #2
    Das liegt daran, dass in dem Moment in dem du das array_filter über das Array laufen lässt die Zeilen die du löschen willst noch ";;" enthalten.
    Du müsstest die Daten erst exploden und dann checken.
    Sprich die Überprüfung innerhalb der for-Schleife durchführen.

    Kommentar


    • #3
      Mmh, okay, aber wie mach ich das? Wie wende ich jetzt array_filter auf die einzelnen Elemente an? Oder sollte ich doch außerhalb der Schleife ansetzen und einfach jede Zeile die nur ;; beinhaltet, löschen?

      Kommentar


      • #4
        prüfe doch einfach innerhalb der for schleife ob das erste Feld im aktuellen Datensatz leer ist:
        PHP-Code:
        for (....) {
         
        $element explode(';'$nonull[$i]);
         if (empty(
        $element[0]))
           continue;
         echo 
        '...';

        in etwa so.

        Kommentar


        • #5
          if (empty($element[0]))
          continue;
          Wenn man das so vereinheitlichen kann, würde ich aber eher auf ; testen, statt erst das aufwendige explode anzuwenden:
          PHP-Code:
           if (';' == $videos[$i][0])
             continue; 
          bzw:
          PHP-Code:
            $videos[$i] = trim ($videos[$i]);
            if (
          ';' == $videos[$i][0])
             continue; 
          besser:
          PHP-Code:
           if ('' == trim ($videos[$i] , " \n\r\t;")
             continue; 
          --

          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


          --

          Kommentar


          • #6
            Hab's duch nen Tipp vom Kumpel inzwischen so gelöst:

            PHP-Code:
            $videos=file("videos.csv");
             for(
            $i=0;$i<count($videos);$i++){
              if (
            preg_match("/^;/",$videos[$i])) continue;
              
            $element=explode(";",$videos[$i]);
               echo 
            "<tr><td>".$element[0]."</td><td>".$element[1]."</td><td>".$element[2]."</td></tr>\n";
              } 
            Welche Methode ist am effizientesten? Anscheinend hab ich als Nichtcoder noch nicht so ganz gerafft, wie ein Array funktioniert. Funktionierte mein array_filter deswegen nicht, weil die zurückgegebene Zeile durch die beiden ;; gar nicht komplett leer war? Ich hatte gedacht, das würde schon auf die einzelnen Elemente des Arrays abziehlen, die bei einer solche Zeile ja den Wert NULL haben.

            Kommentar


            • #7
              Deine CSV Datei hat, wenn du sie ausliest nur einzelne Zeilen(String). Erst, nachdem du PHP sagst, dass diese durch ein semikolon gesplittet werden sollen, wird daraus ein array. Du musst dir Arrays wie Karteikästen vorstellen, jede Karte ist ein Element, hat einen Index und da steht auch was drinn.

              Weil du versucht hast, array_filter auf nen String anzuwenden, hat PHP nichts gemacht, weil es der falsche Dateityp war und es nichts gefunden hat, was leer ist, denn ein Semikolon ist nicht gleich leerzeichen. Wenn du willst kannst du dir mal die ASCII codes anschaun, dann siehst du, wie PHP etwas interpretiert.Z.b. hat ein Leerzeichen den Code 32, ein Semikolon hingegen 59 (32 != 59)

              http://www.torsten-horn.de/techdocs/ascii.htm

              Mfg

              Kommentar


              • #8
                Welche Methode ist am effizientesten? Anscheinend hab ich als Nichtcoder noch nicht so ganz gerafft, wie ein Array funktioniert. Funktionierte mein array_filter deswegen nicht, weil die zurückgegebene Zeile durch die beiden ;; gar nicht komplett leer war? Ich hatte gedacht, das würde schon auf die einzelnen Elemente des Arrays abziehlen, die bei einer solche Zeile ja den Wert NULL haben.
                Naja, was sollen wir jetzt sagen? Das musst Du lernen, denn das wird Dir niemand erklären. Oben (#2) steht übrigens dazu schon eine Aussage.

                Was die Lösung Deines Kumpels angeht - die ist schlicht Unsinn:
                - es fehlt die Ziechenklasse. So wird auf das Zeichen ^ gefolgt von ; geprüft. Was vermutlich nie vorkommt.
                - auch mit Klasse macht sie nicht viel mehr Sinn - Sie sucht dann nach irgendeinem Zeichen ausser ; UND ignoriert dann diesen Datensatz! Also genau das falsche
                - auch Umbrüche sind Zeichen
                - sie ist inperformant. Ich wette, meine trim Lösung ist schneller.
                --

                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                --

                Kommentar


                • #9
                  Sorry nikosch, aber da liegst Du daneben. Das preg_match() überprüft auf ein Semikolon am Anfang des übergebenen Strings. Ne Zeichenklasse braucht es da nicht. Das Ding macht im wesentlichen nichts anderes wie Dein erster Beispielcode.

                  Ich würde allerdings auch kein preg_match() dafür benutzen. Falls eine Prüfung auf Semikolon am Anfang langt, dann wäre Dein erstes Beispiel wohl die performanteste Variante.

                  Gruß Jens

                  Kommentar


                  • #10
                    Sorry nikosch, aber da liegst Du daneben. Das preg_match() überprüft auf ein Semikolon am Anfang des übergebenen Strings.
                    Stimmt, jetzt wo Du es sagst. Ist aber auch wenig sinnvoll, denn das sagt allenfalls etwas über ein Fehlendes Feld, nicht aber über einen fehlenden Datensatz aus. Denn dann kann ich auch einfach $videos[$i][0] auf ; prüfen.
                    --

                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                    --

                    Kommentar


                    • #11
                      Bei einer so simplen Überprüfung ist ein Regex da nicht eher wie mit Kanonen auf Spatzen zu schießen ??

                      Kommentar


                      • #12
                        Nicht ganz, wenn der Regex stimmt, trifft man immer, Spatzen können jedoch kurz davor davonfliegen

                        Aber eigentlich hast du recht.

                        Kommentar


                        • #13
                          Wieso nicht einfach den Callback Parameter von [MAN]array_filter[/MAN] benutzen?
                          MfG

                          Kommentar


                          • #14
                            Zitat von MasterD Beitrag anzeigen
                            Nicht ganz, wenn der Regex stimmt, trifft man immer, Spatzen können jedoch kurz davor davonfliegen

                            Aber eigentlich hast du recht.
                            Du liegst falsch, hier kommt es auf die Wahl des Kalibers an, dieses mus groß genug gewählt sein, dass der Spatz nicht schnell genug von der Mitte bis zum Rand flüchten kann!


                            Sry, ich konnte nicht wiederstehen

                            Kommentar


                            • #15
                              Klappt nun gut mit

                              PHP-Code:
                              if (';' == $videos[$i][0])
                                 continue; 

                              Kommentar

                              Lädt...
                              X