Auge: (PHP) Falsche Bedingung in Schleife

Hallo

Für die Anzeige des Inhalts einer *.txt-Datenbank
mit der Bedingung, ab einem bestimmten Datum anzuzeigen
habe ich eine Schleife geschrieben, um die Einträge, die
vor dem bestimmten Datum liegen auszufiltern.

Bsp. DB:
03.09.|Di|Konzert|6 EUR|20 Uhr|Bla bla bla
16.09.|Mi|Party|2 EUR|21 Uhr|Dies und das
05.09.|Do|Party|2 EUR|22 Uhr|Jenes
15.09.|So|Konzert|13 EUR|20 Uhr|Holy Moses
...
die Termine stehen also in der txt-Datei ungeordnet drinnen.

PHP-Datei:

$datei = @file("$aktuell);
sort($datei,SORT_NUMERIC);
reset($datei);

for($b=0;$b<count($datei);$b++)
   {
   $datum = $datei[$b];
   $datum = substr($datum,0,2);    //Extraktion des Monatstages
   if ($datum<=$heuer)             //$heuer = heute - 2 Tage
      {
      array_shift($datei);
      }
   }

Fehler erkannt:
Wenn die erste Zeile aus dem Array gelöscht wurde,
rückt die Nächste Zeile auf den offset 0 (Zeile 0),
Die Schleife geht nun aber in die Zeile 1 und prüft
demnach nicht die "neue" Zeile 0, die ebenfalls
vor der definierten Datumsgrenze liegen könnte.

Gebe ich die gesuchten Zeilen mit:
   if ($datum<=$heuer)
      {
      echo $datei[$b]."<br>";
      }
aus, bekomme ich die optische Bestätigung, daß alle
zu löschenden Zeilen gefunden werden. In dem Moment
verändere ich ja auch nichts an dem Array.

Ich habe schon versucht, den Zeiger mit reset($datei)
in die Zeile 0 zurück zu verfrachten, jedoch bricht die
Schleife dann ab.

Nun weiß ich nicht mehr wirklich weiter.
Ich könnte eine Variable hochzählen, :
Gebe ich die gesuchten Zeilen mit:
   if ($datum<=$heuer)
      {
      if($b==0)
         {
         $var=1;
         }
      else
         {
         $var+1;
         }
      }
um nach der Schleife mit array_splice($datei,0,$var) alle
unerwünschten Zeilen mit einem Mal zu entfernen.
Vielleicht ist das aber zu kurz gedacht, oder zu umständlich.
Vielleicht reicht ja auch eine andere Schleifenbedingung.

Ich bin an anderen Meinungen und (für mich) neuen Gedanken interessiert.

Tschüß, Auge

  1. Moin Moin!

    Ich kenne PHP ja nicht so gut, aber da es viel von Perl kopiert hat, schreib ich einfach mal meine Perl-Lösung hin. Der Trick ist, im grep eine Funktion aufzurufen, die prüft, ob Du die Zeile haben willst oder nicht.

    sub datum_bis($$) # $rohzeile, $datum_MMDD
    {
      my ($line,$referenz)=@_;
      $line=~/^\d{2}.\d{2}./ or return 0; # wenn das Pattern nicht paßt, ist die Zeile ohnehin Schrott.
      return "$2$1" <= $referenz; # Monat vor den Tag gezogen macht den Vergleich leichter.
    }

    open FILE,"<datei.txt" or die "Oops: $!";
    my @lines=grep { datum_bis($_,'0331') } <FILE>;
    close FILE;

    Übrigens: Was ist mit Jahreswechsln ? Ich sehe in Deinen Daten keine Jahreszahl.

    Und noch ein "Übrigens": Wenn Du Dein Datum in der Reihenfolge Jahr - Monat - Tag ablegst, wird die Sortierung wesentlich einfacher.

    Alexander

    1. Moin Moin!

      Hallo

      Mit dem Code werd ich mich mal morgen befassen, weil

      • heute keine Nerven mehr
      • wenig Ahnung von Perl :-)

      Übrigens: Was ist mit Jahreswechsln ? Ich sehe in Deinen Daten keine Jahreszahl.

      In der DB brauche ich die nicht, da für jeden Monat eine Datei
      angelegt wird. In der Datei sind nur anzuzeigende Inhalte und
      evtl. ein Steuerzeichen enthalten, daß es mir ermöglicht,
      aus dem Titel der Veranstaltung einen Link zu machen (z.B. zu Bandinfos).

      Die Anzeige der Daten erfolgt 14 Tage im Voraus, dazu wird bei
      Bedarf auch die Datei für den nächsten Monat mit eingelesen
      und an das Array hinten angehängt. Welcher der nächste Monat ist,
      wird vor dem Einlesen der Datei(en) mit Datumsfunktionen ermittelt.

      Und noch ein "Übrigens": Wenn Du Dein Datum in der Reihenfolge Jahr - Monat - Tag ablegst, wird die Sortierung wesentlich einfacher.

      Innerhalb der Datei unnötig, weil pro Monat eine Datei.
      Die Dateien selbst erhalten bei deren Erstellung einen
      dynamisch erzeugten Dateinamen nach dem Schema yyyymm.txt.

      Da ist also schon ein Schema vorhanden :-)

      Danke erstmal, Tschüß, Auge