Archiv verlassen und diese Seite im Standarddesign anzeigen : Array-Problem
Azadoras 10-11-2007, 11:09 Moin Leute,
zunächst möchte ich mal den Zusammenhang erläutern.
Ich möchte mir für meine Seite eine Such-Funktion basteln, mit der man die Titel der Einträge durchsuchen kann. Dazu wird zunächsteinmal die Sucheingabe in die einzelnen Wörter aufgesplittet und in ein Array eingelesen.
$suchbegriff = $_POST['suchbegriff'];
$suche = explode(" ", $suchbegriff);
Dann wird mittels foreach jeder vorhandene Titel nach jedem Wort im Array durchsucht, über folgendes Query:
$query = "SELECT title FROM eintraege WHERE title LIKE '%$such_element%' AND state = '2'";
So, nun möchte ich aber Worte wie Artikel oder Personalpronomen da herauslassen, da das die Suche verfälschen würde.
Ich hab schon herausgefunden, dass sich mit:
$artikel = array('der', 'die', 'das');
foreach($artikel as $artikel)
{
$key[] = array_search($artikel, $suche);
}
die Positionen der gesuchten Wörter im Array ermitten lassen.
Nun ist bloß die Frage, wie ich diese entsprechenden Elemente aus dem Array entfernen kann. array_slice(); entfernt ja nur ganze Bereiche von x bis y, ich will ja aber bloß einzelne Elemente entfernen, die nicht unbedingt nebeneinander liegen.
Wie stell ich das an ?
Habe
Hier (http://www.php.net/manual/de/ref.array.php) eine Weile gesucht und die Funktionen durchgeblättert, aber bin auf nichts gestoßen, das mir weitergeholfen hat.
Danke für eure Hilfe schonmals!
Gruß,
Aza
ähm ... warum eleminierst du sie nicht, bevor du sie in einzelne Suchbegriffe zerlegst?
$suchbegriff = str_replace($artikel, "", $suchbegriff);
....
Azadoras 10-11-2007, 12:01 Danke erstmal, aber das funktioniert nicht.
Ich spalte den Sucheingabe-String ja immer zwischen den Leerzeichen auf. Ersetzt man nun aber ein Wort mit nichts im String, dann sind zwischen zwei anderen Wörtern dann 2 Leerzeichen, und dann funktioniert das ganze nichtmehr. :>
seufz, dann mach doch so:
$artikel = array("der ", "die ", "das ");
creativ bist du nicht, nicht wahr?
und selbst wenn du die sperrwörter schon im array hast, dann kannst du sie doch ohne probleme da raus löschen. :confused: unset
Original geschrieben von Azadoras
Nun ist bloß die Frage, wie ich diese entsprechenden Elemente aus dem Array entfernen kann.
unset($array[$key])
array_search() musst du allerdings in einer while-schleife laufen lassen, falls artikel öfter vorkommen.
asp2phps vorschlag (falls du diesen weiterverfolgst) ist noch nicht ganz korrekt, z.b. bei suchbegriffen wie "adidas".
Original geschrieben von 3DMax
asp2phps vorschlag (falls du diesen weiterverfolgst) ist noch nicht ganz korrekt, z.b. bei suchbegriffen wie "adidas".
aber so schon ;)
$artikel = array(" der ", " die ", " das ");
$suchbegriff = str_replace($artikel, " ", $suchbegriff);
Original geschrieben von asp2php
aber so schon ;)
ich wusste, dass das kommt ;)
nein, auch nicht, wenn der artikel am anfang steht.
Wäre dann eher mit regexp zu lösen. Da würde ich dann aber die stringvariante im array vorziehen.
Original geschrieben von 3DMax
ich wusste, dass das kommt ;)
nein, auch nicht, wenn der artikel am anfang steht.
:D :D
$artikel=array("der","die","das");
foreach($string as $k=>$v){
if(in_array(strtolower($v),$artikel))
unset($string[$k]);
}
so in der art vielleicht?
zwar nicht sehr elegant, aber es funktioniert!
Mit nem kleinen Fehler, den der TS hoffentlich selbst entdeckt. ;)
Ich hoffe, ich habe nun nichts falsch verstanden, aber das wäre doch eine ideale Anwendung für array_diff() (http://www.php.net/manual/de/function.array-diff.php)?
Je nach weiterer Anwendung könntest du dir evtl. auch einmal die MySQL-Volltextsuche (http://dev.mysql.com/doc/refman/5.1/de/fulltext-search.html) ansehen.
dem TS hält das angeblich nicht für geeignet. ;)
Azadoras 10-11-2007, 15:02 Danke an euch alle für die zahlreichen Vorschläge zur Lösung des Problems.
Ich habe es nun wie folgt gelöst, und auf den ersten Blick scheint es auch wie gewollt zu funktionieren:
$forbidden = array('ich', 'du', 'er', 'sie', 'es', 'wir', 'ihr', 'sie', 'der', 'die', 'das', 'eine', 'ein', 'einer');
$suchbegriff = strtolower($suchbegriff);
$suche = explode(" ", $suchbegriff);
foreach($forbidden as $f)
{
$key[] = array_search($f, $suche);
foreach($key as $key)
{
unset($suche[$key]);
}
}
Ich habe auch mal ein paar Titel eingegeben, wo "das" mehrfach drin vorkommt, es scheint also zu langen das array_search da in der foreach-Schleife zu haben. Wüsste auch nich, wie ich das da jez in ne While-Schleife noch reinwursten sollte.
Naja, danke euch, das mit dem unset funktioniert jedenfalls. Wenn meine Lösung aber doch noch irgendwelche Lücken/Fehler aufweisen sollte, die mir gerade nicht klar sind, dann wäre ich für deren Aufklärung dennoch sehr dankbar!
Original geschrieben von Azadoras
Ich habe auch mal ein paar Titel eingegeben, wo "das" mehrfach drin vorkommt, es scheint also zu langen das array_search da in der foreach-Schleife zu haben. Wüsste auch nich, wie ich das da jez in ne While-Schleife noch reinwursten sollte.
glauber ich dir nicht, dass das geht.
aber im manual zu array_search steht noch eine alternative:
If needle is found in haystack more than once, the first matching key is
returned. To return the keys for all matching values, use array_keys() with
the optional search_value parameter instead.
achso, geht doch, das array wird ja vergrößert - naja, eher unfreiwillig ;)
Azadoras 10-11-2007, 15:50 Also ich habs jez nochmals getestet, das funktioniert schon so.
Allerdings habe ich ein anderes Problem nun noch.
Ich habe z.B. den Beitrag "Das Dorf".
Gibt man bei Suche ein: "Das Dorf" oder "klmsdjasbäüdknmasbödnkbas Dorf", dann findet er den Eintrag.
Gibt man lustigerweise aber ein "Dorf". Dann findet er nix. :>
Ich kapier ehrlichgesagt nicht warum das so ist.
Hiernochmal der komplette Code:
$forbidden = array('ich', 'du', 'er', 'sie', 'es', 'wir', 'ihr', 'sie', 'der', 'die', 'das', 'eine', 'ein', 'einer');
$suchbegriff = strtolower($suchbegriff);
$suche = explode(" ", $suchbegriff);
foreach($forbidden as $f)
{
$key[] = array_search($f, $suche);
foreach($key as $key)
{
unset($suche[$key]);
}
}
echo "<center>";
foreach($suche as $such_element)
{
$such_element = mysql_real_escape_string($such_element, $sql);
$query = "SELECT title, id, fach, type FROM eintraege WHERE title LIKE '%$such_element%' AND state = '2'";
echo "<br>";
$res = mysql_query($query);
$count = mysql_num_rows($res);
$found = array(" ");
echo "<font size=\"5pt\"><b>Suchergebnis:</b></font><br><br>";
while($row = mysql_fetch_object($res))
{
$id = $row->id;
$title = $row->title;
if(!in_array("$title", $found))
{
echo "<br><a href=\"index.php?site=Hausarbeiten&action=showentry&id=$id\">$title - [$row->fach, $row->type]</a><br>";
$found[] = $title;
}
}
}
Vergleich doch einfach mal die beiden Queries und lass nicht immer alles die anderen machen!
Azadoras 10-11-2007, 16:07 Was ich selber hinkriege, das mache ich ja auch selber. Aber es kommt ja nichtmals bis zum Query, und ich kapier nicht warum.
Ich habe in die foreach-Schleife, in der das Query ist einfach mal echo 'bla'; geschrieben um zu schauen ob das überhaupt ausgeführt wird. Da tut sich garnix. :>
Nach
foreach($key as $key)
{
unset($suche[$key]);
}
ist $suche leer, wenn in der Sucheingabe nur ein Wort vorhanden war. :>
Mach ich davor print_r($suche); dann kommt sowas raus:
Array ( [0] => dorf ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( )
mach ichs hinterher kommt nur Array ( ) Array ( ) Array ( ) Array ( ).... :>
warum gehst du nicht $suchbegriff durch und prüfst ob der wert in_array() $forbidden ist und löschst ihn dann raus? Das dürfte sauberer sein, als dein jetziger Code.
Azadoras 10-11-2007, 16:13 Arg, bin ich doof. Jo, danke, ich prüfe jez einfach vor dem rauslöschen aus dem array, ob überhaupt eines der forbidden-Wörter in dem Array drin ist und lass es nur dann löschen.
Das funktioniert.
Sorry, ich bin noch nich ganz so erfahren im Coden, daher hab ich gelegentlich mal ein Brett vorm Kopf und komm nicht auf sowas.
Danke dir für die Hilfe!
Nicht, wenn man Soll- und Ist-Zustand regelmäßig prüft. ;)
|
|