PHP - Array in Array enthalten?
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
aktuelle zeile
anwenden
array
beispiel
break
code
datenbank
http
inneren schleife
mache
manual
nehmen
ressource
schleifen
sparen
suchbegriff
tag
treffer
url
zeile
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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. -
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 -
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
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.
$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
}
}
Beitrag zuletzt geändert: 23.6.2011 21:58:43 von drafed-map -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage