Wie kann man in PHP aus dem Inhalt einer Keyword-Spalte einer Datenbanktabelle möglichst effizient Kategorien erzeugen?
Ich bin gerade dabei auf meinem NAS (nicht öffentlich) eine Webapp für Videos in PHP zu entwickeln.
Was mir noch fehlt, sind Kategorien.
Meine Idee war jetzt aus der Spalte die die Suchworte enthält, alle Suchworte aller Einträge zu extrahieren um daraus automatisiert Kategorien zu erzeugen.
Hat sowas schon mal jemand programmiert und kann mir hier ein Snippet posten.
Sind die Suchworte jedes einzeln oder für jedes Video irgendwie getrennt in einer Zeile ? mysql ? Ungefähre Datenbankstruktur wäre auch gut...
Ich habe einfach eine Spalte mit der Bezeichnung "Keywords" hinzugefügt. Da trage ich einfach die passenden Suchwortexdurch Leerzeichen getrennt ein.
2 Antworten
elenaBC2411 hat recht, wenn die Datenbank in Normalform wäre, wäre das eine Zeile Zeile SQL, so ist es leider aufwendiger. Entweder du baust die DB um oder musst das in PHP machen, was dann länger dauert
- Abfrage aller Keywords SELECT keywords FROM ...
- pro Zeile: aufsplitten in ein temp. Array $tmp=explode(' ', $dbres['keywords'])
- pro keyword in $tmp das in ein assiziatives Array werfen, keyword als key, Anzahl als Value, also foreach($tmp as $key) if (isset($out[$key])) $out[$key]++; else $out[$key]=1;
- nach den ganzen Sammeln kannst du dann das $out Array mit arsort sortieren und aus den häufigsten Keywords die Kategorien bilden.
So ich habe es jetzt hinbekommen - für den Fall das noch mal jemand sowas benötigt:
$sql = "SELECT * FROM MovieDB WHERE fsk18 <= ".$FSK." AND FileKeywords IS NOT Null;";
$results = $mysqli->query($sql);
$tmp = array();
$category = array();
if ($results->num_rows > 0)
{
while($row = $results->fetch_assoc())
{
$Keywords = preg_replace("%(\r\n)|(\r)%", "", $row['FileKeywords']);
$Keywords = preg_replace("/\s\s+/", " ", $Keywords);
$tmp = explode(' ', $Keywords);
foreach($tmp as $key)
{
if (!isset($category[$key][0]))
{
$category[$key][0] = $key;
$category[$key][1] = 1;
}
else
{
$category[$key][1]++;
}
}
}
}
asort($category);
foreach($category as $key) {
echo '<a href="http:'._SITE_PATH."/index.php?lang="._LANGUAGE."§ion=apps&search=".$key[0]."&AppID="._APP_ID._SSID.'">'.$key[0]."</a>"." (".$key[1].")<br>\n";}
Ich hätte noch dazuschreiben sollen, das du bei einem "einfachen" Array einfach "foreach($category as $key=>$value)" hättest benutzen können oder mit array_keys auch alle Keys aus dem Array bekommst, hätte die 2. Ebene dort gespart.
Das "if ($results->num_rows > 0)" ist nicht nötig, weil das fetch_assoc direkt null zurückgibt wenn es keine Ergebnisse gibt und das while dann nicht ausgeführt wird.
Auslesen und anzeigen von Datenbankeinträgen. Wo ist da das Problem? Mach erst mal die Basics und bring deine DB in die 3. Normalform!
Da keine Unterkategorien sondern nur eine Ebene vorgesehen ist, macht eine extra Tabelle für die Kategorien oder Suchbegriffe keinen Sinn - im Gegenteil würde das Projekt dadurch nur noch unübersichlicher.
Das kann man nicht mit einer Artikeldatenbank vergleichen, die in Relation mit verkauften Artikeln, Käufern und Ländern mit unterschiedlichen Umsatzsteuersätzen steht.
Diese Unterscheidungsfähigkeit gehört auch zu den Basics.
Da macht die Datenbank keinen Sinn. Dann kannste die Keywords auch gleich in den Dateinamen schreiben und auf die DB verzichten.
Ohne DB hat man aber auch keinen Zugriffszähler, keine Bewertungsmöglichkeit und für Menschen lesbare Dateinamen sind dann auch kompliziert
Vielen Dank