thomas: Ausgabeproblem mit doppelter foreach()

Hallo alle zusammen, ich habe ein Problem, an dem ich sehr zu knabbern habe. Innerhalb der Ausgabe einer Suchmaschine verwende ich 2 foreach-Schleifen:

$zeile=file($datei);
$match=0;
$woerter=explode(" ", $_GET["key"]);
foreach($woerter as $einzelwort) {
 foreach($zeile as $detail){
  if(substr_count($detail, $einzelwort)==true) {
  $match++;
   if($match!==0) {
   $split_detail=explode("###",$detail);
   echo <<<EOT
   //Hier steht die Ausgabe
   EOT;
   }
  }
 }
}

Wenn ich jetzt 2 Suchwörter eingebe, z.B. abend schlafen und beide Wörter in 2 Einträgen gefunden wurde, erhalte  eigentlich ganz logisch wegen der verschachtelten foreach-Schleifen  insgesamt 4 Treffer anstatt 2, wobei dich die Einträge wiederholen. Wie kann ich dieses Ausgabeproblem lösen? Gibt es da eine schlaue Methode? Bin für jeden Tipp dankbar, es muss kein Code sein (man will ja lernen)!

Thomas.

  1. Hi,

    Wenn ich jetzt 2 Suchwörter eingebe, z.B. abend schlafen und beide Wörter in 2 Einträgen gefunden wurde, erhalte  eigentlich ganz logisch wegen der verschachtelten foreach-Schleifen  insgesamt 4 Treffer anstatt 2, wobei dich die Einträge wiederholen. Wie kann ich dieses Ausgabeproblem lösen? Gibt es da eine schlaue Methode? Bin für jeden Tipp dankbar, es muss kein Code sein (man will ja lernen)!

    Gefundene Werte nicht ausgeben, sondern in ein neues Array speichern - falls sie dort noch nicht drin stehen...

    cu,
    Andreas

    --
    Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
    http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
    1. Sorry wenn ich nicht gleich verstehe, aber was soll ich in ein Array speichern?

      1. Hi,

        Sorry wenn ich nicht gleich verstehe, aber was soll ich in ein Array speichern?

        Das, was Du ausgeben willst, speicherst Du in Deiner verschachtelten Schleife erstmal in ein neues Array (falls es nicht schon als Eintrag drinsteht).

        Nach den verschachtelten Schleifen gibst Du dann das aus, was im neuen Array steht.

        cu,
        Andreas

        --
        Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
        http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
        1. Ok danke für den Tipp!

          Thomas.

          1. Habs jetzt so gelöst:

            $zeile=file($datei);
            $match=0;
            $woerter=explode(" ", $key);
            foreach($woerter as $einzelwort) {
            foreach($zeile as $detail){
            $search=substr_count($detail, $einzelwort);
            if($search==true) {
            $match++;
            $save=array();
            for($i=0; $i<=$match-2; $i++) {
            $save[$i]=$zeile[$i];
            }
            }
            }
            }
            if($match!==0) {
            $treffer=count($save);
            foreach($save as $load) {
            $line_d=explode("[*]", $load);
            echo <<<EOT
            //Ausgabe
            EOT;
            }
            }

            Ich speicher die Zeilen, die wegen der Suchwörter zutreffen, in einem neuen Array und gebe das nach der foreach() aus.

            Thomas.

  2. Hallo Thomas,

    was willst Du behalten? Ich gehe mal davon aus, dass Du Dateien finden willst, in denen BEIDE Worte drinstehen?

    Im Prinzip ist das mit einem Durchlauf machbar. Den zweiten versteckst Du in einer Funktion namens strpos()

    int strpos ( string haystack, string needle [, int offset])

    Lade Die ganze Datei mit fopen()+fread()+fclose() oder mit der neuen Funktion file_get_contents()in eine Variable. Dann kannst due die nach dem Vorhandensein der beiden Begriffe durchforsten.

    Grüße

    Chris (C)