MySQL-Spalte in Array speichern

Hallo liebe Community,

erstaunlich - du dem Titel von diesem Thema gibt es unzählige Treffer bei Google, doch irgendwie will nichts bei mir funktionieren.

Mein Code sieht wie folgt aus:


$input = "waRum ist der himel blau",

// Wörterarray als Vergleichsquelle
		$words  = array (
						'Warum ist der Himmel blau',
						'Gibt es Yetis',
						'Ist Schwarz eine Farbe',
						'Warum ist das Meer blau',
						'Besteht der Mond aus Käse',
						'Warum ist Blut rot',
						'Wie viele Kontintente gibt es',
						'Warum wird in manchen Ländern auf der linken Seite gefahren',
						'Sind Erdbeeren Obst');
						// noch keine kürzeste Distanz gefunden
						$shortest = -1;
						// durch die Wortliste gehen, um das ähnlichste Wort zu finden
						foreach ($words as $word) 
							{
							// berechne die Distanz zwischen Inputwort und aktuellem Wort
							$lev = levenshtein($input, $word);
							// auf einen exakten Treffer prüfen
							if ($lev == 0)
								{
								// das nächste Wort ist das Wort selbst (exakter Treffer)
								$closest = $word;
								$shortest = 0;
								// Schleife beenden, da wir einen exakten Treffer gefunden haben
								break;
								}
							// Wenn die Distanz kleiner ist als die nächste gefundene kleinste Distanz
							// ODER wenn ein nächstkleineres Wort noch nicht gefunden wurde
							if ($lev <= $shortest || $shortest < 0)
								{
								// setze den nächstliegenden Treffer und die kürzestes Distanz
								$closest  = $word;
								$shortest = $lev;
								}
							}
						$a_umformungen = levenshtein($input, $closest);
						$a_zeichen = strlen($input);
						$a_zeichen3 = $a_zeichen / 2;
						if ($a_umformungen > $a_zeichen3) 
							{
							echo "Tut mir leid, auf diese Frage besitze ich keine Antwort.";
							}
							else 
							{
							if ($shortest == 0) 
								{
								echo "Exakter Treffer gefunden: $closest\n";
								} 
								else 
								{
								echo "Meinten Sie: $closest?\n";
								}			
		# Get a specific result from the "example" table
		$result = mysql_query("SELECT * FROM wissen_irs
		 WHERE frage='$closest'") or die(mysql_error());  

		# get the first (and hopefully only) entry from the result
		$row = mysql_fetch_array( $result );




		echo $row['antwort'];								}

Das Programm soll die Eingabe mit in der Datenbank hinterlegten Fragen vergleichen, besteht zwischen Eingabe und einer hinterlegten Frage eine gewisse Übereinstimmung so wird die zu dieser in der Datenbank hinterlegten Frage die Antwort ausgegeben.

Den Array mit den Fragen gibt es auch als Datenbank und diese soll statt diesem verwendet werden. Allerdings schaffe ich es nicht die Spalte mit den Fragen in einen Array zu laden mit dem das Programm etwas anfangen kann.

Entweder es spuckt mir “Datenbank”, “Array”, “Record#3” oder sonst irgendeine Fehlermeldung aus.

Versuche der Art:

[code]$mein_array = array (“Zeug aus DB”);

$zeugs=mysql_query(“SELECT * FROM fw_tipps”);
while($zeile=mysql_fetch_array($zeugs)){
array_push($mein_array, $zeile[“die_spalte”]);
} [/code]
…blieben Erfolglos.

Das eigentliche Problem besteht darin, dass die foreach-Schleife ein Array wie in obigem Code erwartet, allerdings ich nicht weis wie ich einen solchen aus einer Datenbank bilden kann.

Ich wäre sehr dankbar wenn mir jemand helfen könnte das Programm zum Laufen zu bringen, es will einfach nicht funktionieren. :neutral_face:
(Verbindungsdaten sind in diesem Ausschnitt nicht zu sehen, funktionieren aber.)

Liebe Grüße

MaxT

Lass das mit der Levenshtein-Distanz, damit wirst du nicht glücklich :wink:

Hallo michi,

ich schätze deine Meinung, sicherlich kannst längst gut einschätze woraus “etwas wird” und was man besser sein lassen sollte. Leider habe ich mich in die Situation etwas festgefahren und würde sehr gerne mit Wladimir Iossifowitsch Lewenstein die Aufgabe lösen.

Die Funktion similiar habe ich einmal getestet, da sie eigentlich wie dafür geschaffen ist, jedoch verhält sich die Laufzeit zu der Anzahl der Einträge kubisch.

Daher muss es mit mit levenshtein() endlich funktionieren. Ich schaffe es jedoch einfach nicht die Spalte meiner MySQL-Tabelle in einen Array/ String zu packen, den der obige Code endlich frisst. Mehr will ich gar nicht.

Liebe Grüße

MaxT :wink:

Levenshtein ist im Schnitt auch nicht wirklich schneller, aber das solltest du testen.

$rows = array();
$result = mysql_query("SELECT id, frage FROM wissen_irs");
while($row = mysql_fetch_assoc($result))
  $rows[$row['id']] = $row['frage'];

//berechne Levenshtein-distanz und speichere kürzeste ID

$short_id = NULL;
$short_count = 50;
foreach($rows as $id => $frage)
  if(($count = get_distance($frage, $input)) < $short_count)
  {
     $short_id = $id;
     $short_count = $count;
   }

$result = mysql_query("SELECT * FROM wissen_irs WHERE id = $short_id");
$result = mysql_fetch_assoc($result);

//...

hilft dir das weiter?

Vielen Dank,

dass du mir eine komplette Lösung anbietest, jedoch scheine ich etwas auf dem Schlauch zu stehen.

Mein Code sieht nach deiner Hilfe nun wie folgt aus:

[code]<?php

Verbindungsdaten

mysql_connect(“localhost”, “wissen_irs”, “xxxxx”) or die(mysql_error());

Datenbank

mysql_select_db(“wissen_irs”) or die(mysql_error());

eingegebenes falsch geschriebenes Wort

$input = ‘carrrot’;

$rows = array();
$result = mysql_query(“SELECT id, frage FROM wissen_irs”);
while($row = mysql_fetch_assoc($result))
$rows[$row[‘id’]] = $row[‘frage’];

//berechne Levenshtein-distanz und speichere kürzeste ID

$short_id = NULL;
$short_count = 50;
foreach($rows as $id => $frage)
if(($count = get_distance($frage, $input)) < $short_count)
{
$short_id = $id;
$short_count = $count;
}

$result = mysql_query(“SELECT * FROM wissen_irs WHERE id = $short_id”);
$result = mysql_fetch_assoc($result);

Ausgabe

echo $result;

?>[/code]
Beim Ausführen erhalte ich die Fehlermeldung dass eine nicht definierte Funktion ausgeführt werden soll. “get_distance” wird dabei bemängelt. Tausche ich diesen Befehl gegen “levenshtein” aus so erhalte ich als Ausgabe “Array”.

Was habe ich denn nun falsch gemacht?

Liebe Grüße

MaxT :wink:

Na, $result ist ein Array, also wenn du diese Variable ausgibst und “Array” erhältst, funktioniert alles ordnungsgemäß.

Wie es richtig heißen müsste, musst du wissen, weil ich dein Datenbank-Layout nicht kenne.

Ach so, $result ist mit $words im ersten Code von mir gleichzusetzen.

Aber trotzdem erhalte ich noch Fehlermeldungen. Mein Code sieht nun wie folgt aus:

[code]<?php

Verbindungsdaten

mysql_connect(“localhost”, “wissen_irs”, “xxxxxx”) or die(mysql_error());

Datenbank

mysql_select_db(“wissen_irs”) or die(mysql_error());

eingegebenes falsch geschriebenes Wort

$input = ‘carrrot’;

$rows = array();
$result = mysql_query(“SELECT id, frage FROM wissen_irs”);
while($row = mysql_fetch_assoc($result))
$rows[$row[‘id’]] = $row[‘frage’];

//berechne Levenshtein-distanz und speichere kürzeste ID

$short_id = NULL;
$short_count = 50;
foreach($rows as $id => $frage)
if(($count = levenshtein($frage, $input)) < $short_count)
{
$short_id = $id;
$short_count = $count;
}

$result = mysql_query(“SELECT * FROM wissen_irs WHERE id = $short_id”);
$result = mysql_fetch_assoc($result);

// eingegebenes falsch geschriebenes Wort
$input = ‘carrrot’;

// Wörterarray als Vergleichsquelle
$words = $result

// noch keine kürzeste Distanz gefunden
$shortest = -1;

// durch die Wortliste gehen, um das ähnlichste Wort zu finden
foreach ($words as $word) {

// berechne die Distanz zwischen Inputwort und aktuellem Wort
$lev = levenshtein($input, $word);

// auf einen exakten Treffer prüfen
if ($lev == 0) {

  // das nächste Wort ist das Wort selbst (exakter Treffer)
  $closest = $word;
  $shortest = 0;

  // Schleife beenden, da wir einen exakten Treffer gefunden haben
  break;

}

// Wenn die Distanz kleiner ist als die nächste gefundene kleinste Distanz
// ODER wenn ein nächstkleineres Wort noch nicht gefunden wurde
if ($lev <= $shortest || $shortest < 0) {
// setze den nächstliegenden Treffer und die kürzestes Distanz
$closest = $word;
$shortest = $lev;
}
}

echo “Eingegebenes Wort: $input\n”;
if ($shortest == 0) {
echo “Exakter Treffer gefunden: $closest\n”;
} else {
echo “Meinten Sie: $closest?\n”;
}

?>
[/code]
Ob ich nun den Befehl get_distance oder levenshtein verwende im oberen Teil spielt keine Rolle, es sagt die Variable $shortest sei nicht gesetzt.

Was mache ich denn nun schon wieder falsch? :neutral_face:

Liebe Grüße

MaxT :wink:

get_distance hab ich natürlich nur als Beispielfunktion verwendet, das kannst du selbst implementieren oder auch levenshtein oder similar_text verwenden :wink:

Neineinein, mysql_fetch_assoc() gibt ja eine Zeile aus der MySQL-Tabelle als assoziatives Array zurück; in dem Fall ist $result ja nur die eine Zeile, in der die Frage am meisten $input ähnelt.

Also müsstest du statt $result halt $result[‘Spalten-Name’] oder wasauchimmer verwenden.

Ohne das jetzt als Codebeispiel zu zeigen, könnte man die Distanzprüfung doch auch direkt in die Schleife einbauen, die die Datensätze aus der Datenbank holt und damit den Aufwand erheblich reduzieren.

Nur den Speicheraufwand, alles andere ist in etwa gleich :wink:

Vielen lieben Dank euch alle, funktioniert alles einwandfrei wie es soll. :slight_smile:

Liebe Grüße

MaxT :wink2: