kostenloser Webspace werbefrei: lima-city


PHP - Array in Array enthalten?

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    momar-blog

    momar-blog hat kostenlosen Webspace.

    Ich habe folgenden PHP-tag/code">Code für eine Suchfunktion, um nach Tags zu suchen, die in einer Datenbank gespeichert sind.
    Die Form für die Tags in der Datenbank ($row ist die aktuelle Zeile) ist "tag1,tag2,tag3", suchen soll man beispielsweise nach "tag1 tag3" ($_GET["q"] sind die Suchbegriffe), um die Zeile als Ergebnis zu bekommen.

    $tags = explode(",", $row["tags"]); //Tags in Datenbank aufteilen
    $stags = explode(" ", $_GET["q"]); //Suchtags aufteilen
    print_r($tags); echo("<br>\n"); //Debug
    print_r($stags); echo("<br>\n"); //Debug
    if (in_array($stags, $tags)) { //Wenn gesuchte Tags in den Tags der aktullen $row enthalten sind
    //Mache irgendwas
    }

    Das in der If-Schleife wird nie ausgeführt, obwohl ich als Debug-Ausgabe das bekomme:
    Array ( [0] => tag1 [1] => tag2 [2] => tag3 )
    Array ( [0] => tag1 [1] => tag3 )

    Was habe ich falsch gemacht?

    Beitrag zuletzt geändert: 23.6.2011 20:42:54 von momar-blog
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Du musst mit foreach() jedes Element des Arrays, das die Suchbegriffe enthält, durchgehen.

    Die Funktion in_array() hast du wohl falsch verstanden, schau dir doch mal das 3. Beispiel auf php.net an.
  4. Autor dieses Themas

    momar-blog

    momar-blog hat kostenlosen Webspace.

    Vielen Dank, hab das jetzt so gelöst, für die die es noch brauchen:

    $tags = explode(",", $row["tags"]); //Tags in Daenbank aufteilen
    $stags = explode(" ", $_GET["q"]); //Suchtags aufteilen
    foreach ($tags as $t) { //Für jeden Tag in der Datenbank
     foreach ($stags as $s) { //Für jeden Suchtag
      if ($t==$s) { //Prüfe, ob der aktuelle Suchtag $s dem aktuellen Datenbanktag $t entspricht
       //Wenn ja, mache irgendwas
       break(2); //Und beende alle Schleifen danach, damit das Suchergebnis nicht nochmal aufgeführt wird.
      }
     }
    }


    Beitrag zuletzt geändert: 23.6.2011 20:44:41 von momar-blog
  5. Beim inneren kannst die in_array() nehmen, um Ressourcen zu sparen. Im Kleinen macht das aber wenig aus. Trotzdem sollte man es so machen, wenn man nicht im Inneren der inneren Schleife eine genauere Untersuchung anstellen will. Der Code funktioniert also auch so:
    $tags = explode(",", $row["tags"]); //Tags in Daenbank aufteilen
    $stags = explode(" ", $_GET["q"]); //Suchtags aufteilen
    foreach ($tags as $t) { //Für jeden Tag in der Datenbank
     in_array($t, $stags) ($stags as $s) { //Auf jeden Suchtag in_array anwenden
    // Mach was
     }
    }
    Noch was: Du solltest mit dem break nicht beide Schleifen beenden, sondern nur die innere. Also 1 nehmen, oder einfach gar nichts dahinter schreiben, denn break funktioniert auch ohne Klammern. Bei der Verwendung von in_array() ist das aber nicht notwendig. Wenn du beide Schleifen beendest, dann bekommt du immer nur einen Treffer. Ich denke aber, dass du willst, dass ein Tag bei einem Treffer genommen wird, er jedoch nicht zwei Mal auftaucht. Deswegen in_array(), oder break mit 1 oder gar nichts, was bei break 1 gleichkommt.

    Beitrag zuletzt geändert: 23.6.2011 21:58:43 von drafed-map
  6. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!