Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Array-Problem [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
brauche Webseite ideal für Vereine und Firmen
- Ad -
php-resource




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

 
asp2php
10-11-2007, 11:20 
 
ä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. :>

 
asp2php
10-11-2007, 12:32 
 
seufz, dann mach doch so:


$artikel = array("der ", "die ", "das ");


creativ bist du nicht, nicht wahr?

 
TobiaZ
10-11-2007, 12:52 
 
und selbst wenn du die sperrwörter schon im array hast, dann kannst du sie doch ohne probleme da raus löschen. :confused: unset

 
3DMax
10-11-2007, 13:00 
 
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".

 
asp2php
10-11-2007, 13:03 
 
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);

 
3DMax
10-11-2007, 13:07 
 
Original geschrieben von asp2php
aber so schon ;)

ich wusste, dass das kommt ;)

nein, auch nicht, wenn der artikel am anfang steht.

 
TobiaZ
10-11-2007, 13:09 
 
Wäre dann eher mit regexp zu lösen. Da würde ich dann aber die stringvariante im array vorziehen.

 
asp2php
10-11-2007, 13:11 
 
Original geschrieben von 3DMax
ich wusste, dass das kommt ;)

nein, auch nicht, wenn der artikel am anfang steht.

:D :D

 
Xer0
10-11-2007, 13:26 
 
$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!

 
TobiaZ
10-11-2007, 13:52 
 
Mit nem kleinen Fehler, den der TS hoffentlich selbst entdeckt. ;)

 
CoReY
10-11-2007, 13:55 
 
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.

 
TobiaZ
10-11-2007, 14:04 
 
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!

 
3DMax
10-11-2007, 15:27 
 
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&nbsp;-&nbsp;[$row->fach, $row->type]</a><br>";


$found[] = $title;
}
}

}

 
TobiaZ
10-11-2007, 15:55 
 
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 ( ).... :>

 
TobiaZ
10-11-2007, 16:10 
 
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!

 
TobiaZ
10-11-2007, 16:16 
 
Nicht, wenn man Soll- und Ist-Zustand regelmäßig prüft. ;)


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:08 Uhr.