Felix Riesterer: Windows-Problem oder Dummheit?

Liebe Experten,

ich verstehe nicht, warum mein Skript (PHP) nicht funktioniert...

Ich möchte eine Text-Datei als Minidatenbank für Termine verwenden (MySQL wäre stark übertrieben!) und versuche nun mit Hilfe von file(datei) und array_search() einen kleinen Terminkalender zu realisieren.

Hier ein kleiner Ausschnitt meiner Text-Datei:

23.11.2004*|*Uhrzeit*|*Veranstaltung*|*Notitzen
01.12.2004*|*Uhrzeit*|*Veranstaltung*|*Notitzen
13.12.2004*|*Uhrzeit*|*Veranstaltung*|*Notitzen

etc.

Nun soll mein Skript den Suchbegriff "1.12.2004" in einem Array, das durch Einlesen dieser Textdatei entstanden ist wiederfinden. Aber die Funktion Array_search findet nix.

Hier mein Skript:

<?php

$termine = file("termin-daten.dat");

$gefunden = array_search("1.12.2004", $termine);

echo "Gefunden? $gefunden<br>\n";
   echo "Gefunden? $termine[$gefunden]<br>\n";

?>

Die Variable $gefunden enthält anscheinend nix, oder einen Wert, der wie Null gerechnet werden muss, denn die zweite echo-Anweisung gibt die erste Textzeile meiner Textdatei aus.

Liegt das an dem Format, mit dem Windows seine Textdateien speichert, dass mein PHP die Suchbegriffe nicht findet? Habe das Ganze bisher zwar nur lokal auf meinem WindowsXP-Recher (Apache mit PHP-Modul) getestet, denke aber, dass das auch so hätte funktionieren müssen.

Für Denkanstöße wäre ich dankbar.

Grüße aus Ellwangen.

  1. morgens Felix,

    Hier ein kleiner Ausschnitt meiner Text-Datei:
    01.12.2004*|*Uhrzeit*|*Veranstaltung*|*Notitzen
    Nun soll mein Skript den Suchbegriff "1.12.2004"
    wiederfinden

    Was es ja wirklich nicht kann. Es gibt in deiner Textdatei zwar "01.12.2004", aber danach sucht dein Script ja nicht ...

    Grüße aus Berlin

    Christoph S.

    1. Hello Felix,

      Das Format "serielle Datei mit wahlfreier Satzlänge" ist ziemlich ungeeignet für vernünftige Dateianwendungen. Besser ist da ein Format mte festem Satzaufbau und damit fester Satzlänge. Da kann man damm im random Access die Daten durcharbeiten.

      Sieh Dir mal die Beispiele auf http://selfhtml.bitworks.de --> Adressverwaltung an. Da sihst Du, wie man ein Random-Access-Format mit PHP bauen kann.

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Sieh Dir mal die Beispiele auf http://selfhtml.bitworks.de --> Adressverwaltung an. Da sihst Du, wie man ein Random-Access-Format mit PHP bauen kann.

        Danke! Werde mir das mal reinziehen. Damit sollte dann mein Vorhaben gelingen.

        Gruß, Felix Riesterer.

    2. Hi Tom!

      Nun soll mein Skript den Suchbegriff "1.12.2004"
      wiederfinden

      Was es ja wirklich nicht kann. Es gibt in deiner Textdatei zwar "01.12.2004", aber danach sucht dein Script ja nicht ...

      Wieso kann denn array_search "1.12.2004" innerhalb von "01.12.2004" nicht finden? Ist das wirklich zuviel verlangt? - Anscheinend schon.

      Jedenfalls Danke für Deine Antwort.

      Gruß, Felix Riesterer.

      1. Hello,

        Wieso kann denn array_search "1.12.2004" innerhalb von "01.12.2004" nicht finden? Ist das wirklich zuviel verlangt? - Anscheinend schon.

        Die Aufgabe von Array_Search() ist es, einen Wrt in einem Array zu finden, und zwar mit genauer Übereinstimmung. In Deinem Array stehen ja auch noch nehr Zeichen in den Elementen, als nur das Datum.

        Wenn Du eine 'enthält_string'-Suchen machen willst, dann musst Du eine eigene Funktion bauen.
        Vielleicht geht das sogar mit Array_map() und str_pos(). Es funktioniert aber auf jeden Fall mit foreach() und str_pos()

        $suchstring = '1.12.2004';
          $_filearray = file($filename);

        $_treffer = array();

        if (is_array($_filearray))                ## foreach() darf nur ein Array bekommen
          foreach($_filearray as $key => $line)     ## in jeder Zeile suchen
          {
            if (false !== ($pos = str_pos($line, $suchstring))  ## ob der Suchstring mindests 1mal vorkommt
            {
              $_treffer[] = $key;                   ## und dann die Zeilennummer merken.
            }                                       ## fängt mit 0 an!
          }

        if (count($_treffer) > 0)
          {
            echo "<p><strong>$suchstring</strong> wurde in den Zeilen ".explode(',',$_treffer)." gefunden</p>\n";
          }
          else
          {
            echo "<p><strong>$suchstring</strong> ist im durchsuchten Bereich nicht vorhanden.</p>\n";
          }

        Außerdem könntest Du über den dritten Paramter von str_pos noch festlegen, ab welcher Position innerhalb der Zeile nach dem Teilstring gesucht werden soll.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
  2. Hab's selber gelöst!

    Der "Trick" war, das Ganze über strpos() zu versuchen. Dazu musste ich lediglich mein Array Stück für Stück durch diese Funktion schleusen. Das ist vielleicht nicht das Günstigste für die Performance, aber es tut. Ausserdem wird meine Text-Datei ja nicht riesig groß, so dass diese String-Operationen sich im Rahmen halten.

    Danke für Eure Ideen!

    Felix Riesterer.