Wie kann man in PHP aus dem Inhalt einer Keyword-Spalte einer Datenbanktabelle möglichst effizient Kategorien erzeugen?

iQa1x  15.10.2024, 22:29

Sind die Suchworte jedes einzeln oder für jedes Video irgendwie getrennt in einer Zeile ? mysql ? Ungefähre Datenbankstruktur wäre auch gut...

stealthuser 
Beitragsersteller
 15.10.2024, 22:40

Ich habe einfach eine Spalte mit der Bezeichnung "Keywords" hinzugefügt. Da trage ich einfach die passenden Suchwortexdurch Leerzeichen getrennt ein.

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

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.
Woher ich das weiß:Berufserfahrung – Softwareentwickler & Admin

stealthuser 
Beitragsersteller
 15.10.2024, 23:10

Vielen Dank

stealthuser 
Beitragsersteller
 16.10.2024, 17:58
@stealthuser

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."&section=apps&search=".$key[0]."&AppID="._APP_ID._SSID.'">'.$key[0]."</a>"."  (".$key[1].")<br>\n";}
iQa1x  16.10.2024, 18:09
@stealthuser

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!


stealthuser 
Beitragsersteller
 15.10.2024, 23:07

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.

elenaBC2411  15.10.2024, 23:26
@stealthuser

Da macht die Datenbank keinen Sinn. Dann kannste die Keywords auch gleich in den Dateinamen schreiben und auf die DB verzichten.

stealthuser 
Beitragsersteller
 16.10.2024, 05:45
@elenaBC2411

Ohne DB hat man aber auch keinen Zugriffszähler, keine Bewertungsmöglichkeit und für Menschen lesbare Dateinamen sind dann auch kompliziert