Datenbank, HTML Suche in PHP verbinden

VanHellsehn

Erfahrenes Mitglied
Hi,

Ich möchte mir eine kleine Suche bauen.. Aber das Problem ist ich habe ein Teil der Informationen in HTML-Dateien und ein anderen Teil in meiner Datenbank stehen. Ok ich kann beides durchsuchen nur wie verküpfe ich die beiden ergebnise Sinnvoll und wie ordne ich die Suche nach relevanz.... Ich möchte gar keinen fertigen Code (beispiele sind natürlich trotzdem gerne gesehen), sondern ein paar denk anstöße.
Danke im voraus
 
Beide Resultate in Array und diese dann mit array_merge() zusammenführen.
Natürlich müssen beide Resultate in der gleichen Form vorliegen.
 
Idee hjatte ich auch aber wie sotiere ich es dann nach der relevanz... also sagen wir in Datensatz-A ist das Wort 3 mal vertretten und in Datensatz-B nur 1mal.. Eine gute Idee dazu?
 
Sorry, solange ich keine Ahnung habe wie deine Suchresultate aussehen kann ich nur Stichwörter für mögliche Lösungen in den Raumwerfen.

Dazu gehören fast alle array-Funtionen von PHP.

array_merge: zusammenfügen beider Mengen
asort: Sortieren der Daten, damit gleiche Werte hintereinader sind.
array_multisort um das ganze nach Relevanz zu sortieren

#EDIT:
vergess den folgenden Code... Schau mein nächster Beitrag..
#EDIT OFF


PHP:
<?php
//Testarray
$arr1 = array('a', 'b', 'c', 'c');
$arr2 = array('b', 'c', 'c', 'd');

$array = array_merge($arr1, $arr2);
//sortieren
asort($array);

//Zählen
foreach($array as $item){
    $lastValue = end($result);
    if ($item == $lastValue[0]){
        ++$result[count($result)-1][1]; 
    } else {
        $result[] = array($item, 1);        
    }    
}

// ein Array mit den Relevanzen und einer mit den dazugehörigen Strings für array_multisort erstellen
foreach($result as $key => $item){
    $strings[$key] = $item[0];
    $relevanz[$key] = $item[1];
}

// Nach relevanz absteigend und String aufsteigend sortieren
array_multisort($relevanz, SORT_DESC, $strings, SORT_ASC, $result);


print_r($result);


?>
 
Zuletzt bearbeitet:
Mein Beisipel von Gestern erschien mir schon beim erstellen zu kompliziert. Leider fehlte mir die Zeit dem weiter nachzugehen.

array_count_values und arsort hat man das Resultat im Handumdrehen
PHP:
<?php
    $arr1 = array('a', 'b', 'c', 'c');
    $arr2 = array('b', 'c', 'c', 'd');
    
    $result = array_count_values(array_merge($arr1, $arr2));
    arsort($result);
    
    print_r($result);
?>
 
Hi,
Danke schon mal ich finde die erste Lösung gut jedoch verstehe ich die zweite nicht ganz..
Also ich habe eine Array mit diesem Format vorliegen:
Code:
Array
(
    [0] => Array
        (
            [title] => Seite 1
            [text] => Ich diesem Text kommt das Wort Startseite vor ;)
            [pfad] => http://localhost/test/error_404.html
        )

    [1] => Array
        (
            [title] => Startseite
            [text] => Hier komm das Wort nicht vor aber im Titel
            [pfad] => http://localhost/test/index.html
        )

)

Das möchte ich Sotieren.. Das würde ich mit deinem ersten Beispiel hinbekommen. Aber ich habe gerade keine Ahnung wie man es machen könnte, dass er zum Beispiel den Titel 5mal so hoch Wertet wie wenn es einmal im Content (der Text) steht?

Ich habe mir gerade folgendes kleines Script geschrieben das meine Dateien Durchsucht:
PHP:
$eingabe = "Startseite"; // Erfolg in der relität von Nutzer
$directory = "./dateien/"; 
$handle = opendir($directory); 
$i=0;

while ($file_name = readdir ($handle))
{
	$file = $directory.$file_name;
	
	if (is_file($file))
	{
		$fd = fopen($file,"r");
		$content = fread($fd, filesize($file));
		fclose ($fd);
		// Titel aus der Datein hohlen
		preg_match('#<h1>.*?</h1>#', $content, $titel);
		// Prüfen ob das gesuchte Wort vorhanden ist
		if (strstr($content,$eingabe))
		{
			$array[$i]['title'] = strip_tags($titel[0]);
			$array[$i]['text'] = strip_tags($content);
			$array[$i]['pfad'] = 'http://localhost/test/'.$file_name;
			$i++;
		}
	}
}
 
So, zuerst mal ein Script das die Zählung richtig macht.
PHP:
<?php
//Testdaten 
$data = array(
            array(
                'title' => 'Seite 1',
                'text' => 'Ich diesem Text kommt das Wort Startseite vor ;)',
                'pfad' => 'http://localhost/test/error_404.html'), 
            array(
                'title' => 'Startseite',
                'text' => 'Hier komm das Wort nicht vor aber im Titel und test mit ö und Ä',
                'pfad' => 'http://localhost/test/index.html')
            );
            
//Gewichtung            
$gewichtung = array('title' => 5, 'text' => 2, 'pfad' => 1);
$wordList = array();

//für jede [key]=>[value] Kombination die Funktion countWords aufrufen
array_walk_recursive($data, 'countWords');
arsort($wordList);

//Ausgabe des Resultates
foreach($wordList as $word => $count) echo "{$word}: {$count}<br />";

//Callback-Funktionen für die array_walks
function countWords($item, $key){
    //Die Wörter auflisten und zählen -> array([wort]=>anzahl)
    $thisWords = array_count_values(str_word_count($item, 1));
    //jeder Eintrag der gefundenen Wörter mit dem Faktor multipliziert der wordList hinzufügen
    array_walk($thisWords, 'addToWordList', $GLOBALS['gewichtung'][$key]);    
} 
    
function addToWordList($count, $word, $factor){
    $GLOBALS['wordList'][$word] = $GLOBALS['wordList'][$word]+($count*$factor); 
}
?>

Wie du das Start-Array $data hinkriegst, ist glaub klar.
 
Dieses Script macht die Gewichtungen für alle Wort in dem Array vorhanden sind.. Aber das Ziel meines Scripts ist es ja nur die Gewichtung von einem Wort bzw. Satz. Und die Gewichtung soll ja für jede Seite einzel einen Wert haben

Code:
Array
(
    [0] => Array
        (
            [title] => Seite 1
            [text] => Ich diesem Text kommt das Wort Startseite vor ;)
            [pfad] => http://localhost/test/error_404.html
            [gewichtung] 2
        )

    [1] => Array
        (
            [title] => Startseite
            [text] => Hier komm das Wort nicht vor aber im Titel
            [pfad] => http://localhost/test/index.html
            [gewichtung] 10
        )

)

Wenn ich diese Array habe fällt das Sotieren ja nicht mehr schwer und das ausgeben auch nicht nur es bis zu diesem Wert zu bringen ist mein Problem.. Du verstehst was ich meine oder?
 
Nu, du willst nicht das was ich verstanden geglaubt habe das du es willst.

Aber auch mit deiner neuen Beschreibung bin ich nicht gescheiter.

Das möchte ich Sotieren.. Das würde ich mit deinem ersten Beispiel hinbekommen. Aber ich habe gerade keine Ahnung wie man es machen könnte, dass er zum Beispiel den Titel 5mal so hoch Wertet wie wenn es einmal im Content (der Text) steht?
Dieses Script macht die Gewichtungen für alle Wort in dem Array vorhanden sind.. Aber das Ziel meines Scripts ist es ja nur die Gewichtung von einem Wort bzw. Satz. Und die Gewichtung soll ja für jede Seite einzel einen Wert haben
Was jetzt? Sind 2 grundverscheidene Anforderungen.

Willst du jetzt die ganzen Sätze vergleichen oder die Wörter in den Sätzen...

Wie sollte das Resultat deines neuen Besipeils aussehen?
Wenn ich das habe, kann ich mir überlegen wie wir dahin kommen.
 
Tut mir leid das ich mich nicht richtig ausgedrückt habe.
Also ich möchte das ein User die möglich keit hat etwas zu suchen.
Also wenn er sagen wir ein Wort ein gibt sollen alle Dateien bzw. die Array durchsucht werden nach diesen Wort und dann soll eine Gewichtung erstellt werden die es ermöglich die Array geordnet aus zu geben (also nach der Gewichtung (Relevanz) sotiert).
Der User soll natürlich auch die möglichkeit haben einen Satz ein zu geben. Dann würden die Texte nach alle Wörtern durchsucht werden.
Aber am Ende soll immer eine Gewichtung zu dem Satzt (Wörtern) oder dem Wort immer auf den ganzen Datensatz bezogen sein.
Also mein Wunsch resultat sieht wie folgt aus:

Code:
Array
(
    [0] => Array
        (
            [title] => Seite 1
            [text] => Ich diesem Text kommt das Wort Startseite vor ;)
            [pfad] => http://localhost/test/error_404.html
            [gewichtung] 2
        )

    [1] => Array
        (
            [title] => Startseite
            [text] => Hier komm das Wort nicht vor aber im Titel
            [pfad] => http://localhost/test/index.html
            [gewichtung] 10
        )

)
 
Zurück