Homer J: Frage zum output buffer, Array, Variable

Hallo!

Ich lese Dateien mit fread() ein. Die Inhalte möchte ich abspeichern, dafür fallen mir 3 Möglichkeiten ein.

1. Alle Inhalte in einem Array speichern
2. Alle Inhalte in eine Varibale packen, also der String wird mit jeder Datei erweitert und hat am Ende sehr sehr viele Zeichen
3. Ich packe die Inhalte in den Ausgabepuffer

Später möchte ich die Wörter aller Dateien für einen Vergleich mit einem Suchwort haben. Das Bedeutet, ich nehme die Inhalte aus einer der oben erwähnten Möglichkeiten und zerlege sie in einzelne Worte mit split() z.b., säuber sie von Sonder- und Leerzeichen u.a. und starte dann den Vergleich mit dem Suchwort.

Bisher habe ich das so gemacht:

  
// Doppelte Werte werden aus dem Array entfernt  
$AllWords = array_unique($AllWords);  
  
// Suchwort wird mit "relevanten" Wörtern verglichen  
    foreach($AllWords as $woerter){  
        similar_text ($suchwort,$woerter,$prozent);  
        //Wenn das Suchwort im Vergleichswort enthalten ist  
        //oder die Ähnlichkeit höher als 60% ist, soll das Vergleichswort als Alternative angeboten  werden  
            if($prozent>65.00||preg_match("/".$suchwort."/i",$woerter)){  
            echo "<a class='cnt' href='?cnt=../suche.php&sw=".$woerter."'>".$woerter."</a><br>";  
                }  
            }  
}  

Was aber je nach Menge von Dateien und dem entsprechend vielen Wörtern, sehr lange dauert. Seht ihr hier eine optimierungsmöglichkeit?

Gruß
Homer J

  1. hi,

    Ich lese Dateien mit fread() ein. Die Inhalte möchte ich abspeichern, dafür fallen mir 3 Möglichkeiten ein.

    1. Alle Inhalte in einem Array speichern
    2. Alle Inhalte in eine Varibale packen, also der String wird mit jeder Datei erweitert und hat am Ende sehr sehr viele Zeichen
    3. Ich packe die Inhalte in den Ausgabepuffer

    Speicherplatz brauchen alle drei Versionen, und die Unterschiede dürften marginal sein.

    2. dürfte den Nachteil haben, dass du nicht mehr weißt, aus welcher Datei ein Textteil ursprünglich stammte - oder ist das nicht wichtig?

    In 3. sehe ich gar keinen Vorteil - da du vermutlich ja nicht alles ausgeben willst, müsstest du den Ausgabepuffer dann doch wieder leeren. Außerdem kannst du nicht "im Ausgabepuffer suchen" - du müsstest also dessen Inhalt erst mal wieder in eine Variable holen = doppelter Speicherbedarf.

    // Doppelte Werte werden aus dem Array entfernt
    $AllWords = array_unique($AllWords);

    Machst du das, nachdem du alle Dateien eingelesen hast - oder nach dem Einlesen jeder einzelnen Datei?

    if($prozent>65.00||preg_match("/".$suchwort."/i",$woerter)){

    Keine besonderen Modifier erkennbar - wozu dann reguläre Ausdrücke?
    Brauchst du die in diesem Falle für irgendwas, was ich am Code jetzt nicht erkennen kann - oder tut's nicht vielleicht auch ein einfaches Suchen per Stringfunktionen wie strpos?

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hi!

      1. dürfte den Nachteil haben, dass du nicht mehr weißt, aus welcher Datei ein Textteil ursprünglich stammte - oder ist das nicht wichtig?

      Das ist hier nicht wichtig!

      // Doppelte Werte werden aus dem Array entfernt
      $AllWords = array_unique($AllWords);

      Machst du das, nachdem du alle Dateien eingelesen hast - oder nach dem Einlesen jeder einzelnen Datei?

      Nachdem ich alle Dateien eingelesen habe und alle Wörter in das Array gepackt habe.

      if($prozent>65.00||preg_match("/".$suchwort."/i",$woerter)){

      Keine besonderen Modifier erkennbar - wozu dann reguläre Ausdrücke?
      Brauchst du die in diesem Falle für irgendwas, was ich am Code jetzt nicht erkennen kann - oder tut's nicht vielleicht auch ein einfaches Suchen per Stringfunktionen wie strpos?

      Macht das denn ein Unterschied? Also ich müsste nur prüfen, ob das Suchwort im Vergleichsstring vorkommt.

      Ich hole ja jeden Wert aus dem Array, um den zu vergleichen, könnte man das nicht anders machen? Es gibt ja z.B. in_array(), um zu prüfen ob ein Wert in einem Array ist, ich denke das geht schon was schneller oder? Aber ich müsste es eben auch mit similar_text() verbinden. Werde das hier mal probieren:

        
      $wert = in_array(similar_text ($suchwort,$woerter,$prozent));  
      
      

      Gruß
      Homer J

      1. echo $begrüßung;

        Nachdem ich alle Dateien eingelesen habe und alle Wörter in das Array gepackt habe.

        Ich denke, es ist einfacher, den String des Gesamttextes nach dem Suchwort zu durchsuchen, wenn das Zerlegen in einzelne Wörter nicht noch einem anderen Zweck dient. Um nach ganzen Wörtern zu suchen bietet sich ein RegExp an, der das Suchwort eingeschlossen in Sequenzen für eine Wortgrenze als Muster erhält.

        echo "$verabschiedung $name";

        1. Hallo!

          Ich denke, es ist einfacher, den String des Gesamttextes nach dem Suchwort zu durchsuchen, wenn das Zerlegen in einzelne Wörter nicht noch einem anderen Zweck dient.

          Ich möchte ja auch die Ähnlichkeit berechnen, wenn ich jetzt den String der als Inhalt den kompletten Text hat vergleiche ist das nicht möglich oder doch?

          Um nach ganzen Wörtern zu suchen bietet sich ein RegExp an, der das Suchwort eingeschlossen in Sequenzen für eine Wortgrenze als Muster erhält.´

          RegExp ist doch das mit den "komischen" Zeichen, was aber doch sehr mächtig ist, das habe ich noch nie kapiert, wie man da bestimmte Zeichen ausschließen kann oder suchen kann.

          1. echo $begrüßung;

            Ich möchte ja auch die Ähnlichkeit berechnen, wenn ich jetzt den String der als Inhalt den kompletten Text hat vergleiche ist das nicht möglich oder doch?

            Gut, das eher weniger. Aber vielleicht ist auch die Wortliste dafür nicht völlig geeignet, da man ja manche Wörter getrennt und zusammen schreiben kann, sowohl im Text als auch bei der Eingabe der Suchwörter.

            RegExp ist doch das mit den "komischen" Zeichen, was aber doch sehr mächtig ist,

            Reguläre Ausdrücke sind sehr mächtig, aber nicht allmächtig. Der Preis dafür ist seine langsamere Ausführung, was bei einfachen Dingen, die mit spezialisierteren Funktionen erledigt werden können, zu sehen ist.

            das habe ich noch nie kapiert, wie man da bestimmte Zeichen ausschließen kann oder suchen kann.

            Als erstes gilt es, die Regel möglichst genau festzulegen. Dabei ist es hilfreich, die Möglichkeiten Regulärer Ausdrücke zu kennen, doch wichtiger ist die Analyse des Problems.
            Um beispielsweise Wörter zu suchen beschreibt sich das Muster so: eine Wortgrenze, gefolgt von einem oder mehreren Buchstaben, gefolgt von einer Wortgrenze. Umgesetzt in einen Regulären Ausdruck sieht das so aus:
            \b - Wortgrenze
            [a-zA-Z] - Zeichenklasse, enthält a bis z und A bis Z [*]

              • ein oder mehrmals
                \b - Wortgrenze

            Zusammengefasst sieht das so aus: \b[a-zA-Z]+\b
            Um nur das gesuchte Wort zu erhalten, kann man noch mit ()-Klammern die Stelle kennzeichnen, die man im Ergebnis haben möchte, also: \b([a-zA-Z]+)\b
            Wie man damit weiterarbeitet steht auf einem andern Blatt (oder im PHP-Handbuch). Außerdem sollte dies nur mal ein einfaches Beispiel sein. Um Reguläre Ausdrücken kennenzulernen sollte sich reichlich Literatur im Netz finden.

            [*] Alternativen:

            • [a-z] und den PCRE_CASELESS-Modifizierer verwenden
            • \w für Wortzeichen

            echo "$verabschiedung $name";