PHP Datei aufrufen auf Grundlage "best macht" der Eingabe

Hotshady

Lt. Junior Grade
Registriert
Apr. 2010
Beiträge
442
Nabend zusammen,

ich komme mal wieder nicht weiter bei meinen Übungen. Folgendes Problem:

Mittels eines Formulars wird eine Eingabe an ein PHP-Skript übermittelt. Diese Eingabe soll nun mit den Dateinamen im img-Ordner verglichen werden und das Bild aufgerufen werden, was die höchste Übereinstimmung zwischen Eingabe und Bildname aufweist.

Mit similar_text() habe ich herumprobiert, komme damit aber nicht wirklich weiter. Gibt es hier eine elegante Lösung "out of the box" bei PHP oder muss ich was basteln?
 
Wo ist das Problem bei similar_text()? Benutzt du den 3. Parameter?
PHP:
int similar_text ( string $first , string $second [, float &$percent ] )
 
Ich glaube, dass ich das Problem hier über eine Datenbank lösen muss. Die Sache ist, dass ich ca. 100 Bilder von verschiedenen Artikeltypen habe. Eine Artikelnummer, die im Formular eingegben und an das Skript übergeben wird, beinhaltet irgendwo im Namen auch den Artikeltyp. Nun soll anhand der Eingabe ein Bild angezeigt werde, was für den eingegebenen Artikel relevant ist.

Bei int similar_text weiss ich besipielsweise nicht, wie ich die ganzen Artikeltypen dort am besten unterbringe und (sollte mir das mal gelingen) ich dann auf Grundlage des besten "matches" noch die entsprechende Datei öffnen kann.
 
Es gibt auch PHP Bordmittel, mit denen sich das lösen lässt. Ob dies schneller ist als eine unscharfe Datenbankabfrage muss man im Einzelfall testen, denn es hängt auch von der Anzahl der Dateinamen ab mit denen der Eingabewert verglichen werden muss.

Mein Vorschlag wäre die Kombination aus zwei nativen PHP-Funktionen, nämlich metaphone() in Verbindung mit levenshtein(). Mit metaphone() erstellt man einen phonetischen String, den man anschließend zum Vergleich mit levenshtein() zur Berechnung der Entfernung heranzieht. Mit Entfernung ist gemeint, wie viele Zeichen man im ersten String einfügen/tauschen/entfernen müsste, damit er identisch zum zweiten String ist.
 
Danke schonmal für die guten Hinweise. Die Berechnung des Abstandes mit levenshtein ist für meinen Fall allerdings nicht ganz so gut geeignet (denke ich zumindest, da bspw Artikel 4710 genau den gleichen Abstand zu 4711 hat, wie 4712). Die methaphone-Funktion habe ich leider nicht wirklich probiert.

Ich habe angefangen mit similar_text zu arbeiten. Vielleicht könnt Ihr mir bei folgender Schleife helfen:

PHP:
	        $inhalt = scandir("img");
		$scan = $_POST["article"];
		var_dump($inhalt);
		
		foreach ($inhalt as $inhaltWert) {
	          $sim = similar_text($scan, $inhaltWert, $sim);
	          echo "<br>" . $sim . "<br>";
	          $prozent[] = [$inhaltWert => $sim];
	        }
	        var_dump($prozent);
    	        echo "<br>" . max($prozent);

1. Wieso ist $sim kein array bei dieser Abfrage wenn ich $sim[] schreibe, kommt eine Fehlermeldung "annot use a scalar value as an array"
2. Deshalb habe ich das Hilfs-array $prozent erstellt. Was ich hier seltsam finde ist, dass die Werte für $sim nicht die Prozentangaben sind, die ich vorher Testweise ermittelt habe. Da steht dann sowas wie:

PHP:
array(6) { [0]=> array(1) { ["."]=> int(0) } [1]=> array(1) { [".."]=> int(0) } [2]=> array(1) { ["module_table_bottom.png"]=> int(6) } [3]=> array(1) { ["module_table_top.png"]=> int(6) } [4]=> array(1) { ["occulus_4711.jpg"]=> int(3) } [5]=> array(1) { ["occulus_4712.jpg"]=> int(3) } }

Wenn ich die similar_text Werte manuell (also ohne die Schleife) berechne, stehen da realistische Prozentangaben, was die Ähnlichkeit angeht.


Was muss ich ändern?
Ergänzung ()

Mal anders gefragt:

Wie bekomme ich die Namen aus dem array $inhalt verglichen mit dem Eingabewert aus $scan und kann dann noch auf Grundlage der Bewertung sagen, welcher Wert aus $inhalt die höchste Übereinstimmung hat? Ich bekomme die Schleife da nikcht hin. Die Ergebnisse aus der Schleife werden hier als int(irgendeineZahl) angezeigt. Die Werte dort stimmen meiner Meinung nach nicht. Zumindest bekomme ich andere Angaben, wenn ich die Werte des arrays $inhalt einzeln durch similar_text schicke.
 
ich verstehe die Zeile nicht:
$sim = similar_text($scan, $inhaltWert, $sim);

du weist der variable sim den Wert der Funktion similar_text zu, und übergibst als Argument die Variable sim, die du gerade zuweist ?
 
Danke für den Hinweis, das macht tatsächlich keinen Sinn.

Was ich nicht so ganz begreife, ist das füllen des arrays $prozent. Laut var_dump wird durch die oben dargestellte foreach Schleife aus $prozent ein mehrdimensionales array. Für jeden Schleifendurchlauf wird $prozent ein neues array mit $inhaltWert als Key und $sim als Value übergeben
PHP:
 VarDump für: $prozent[] = [$inhaltWert => $sim]:
array(6) { [0]=> array(1) { ["."]=> float(0) } [1]=> array(1) { [".."]=> float(0) } [2]=> array(1) { ["module_table_bottom.png"]=> float(22.857142857143) } [3]=> array(1) { ["module_table_top.png"]=> float(25) } [4]=> array(1) { ["occulus_4711.jpg"]=> float(85.714285714286) } [5]=> array(1) { ["occulus_4712.jpg"]=> float(78.571428571429) } }

Wenn ich das das array wie folgt anpasse, steht nur ein Wert (der letzte Wert aus dem Schleifendurchlauf) im array:
PHP:
 VarDump für: $prozent = array($inhaltWert => $sim):
VarDump Prozent:
array(1) { ["occulus_4712.jpg"]=> float(78.571428571429) }

Was ich im Grunde möchte, ist der Vergleich des Eingabewertes $scan mit den Werten des arrays $inhalt unter Angabe der "Ähnlichkeit" als $sim in einem array. Was mache ich falsch??
Ergänzung ()

So habe ich den Code nun abgeändert:

PHP:
$inhalt = scandir("img");
		$scan = $_POST["article"];
		echo "VarDump Inhalt: <br>";
		var_dump($inhalt);
		

		foreach ($inhalt as $inhaltWert) {
	        similar_text($scan, $inhaltWert, $sim);
	        $prozent = array($inhaltWert => $sim);
	    }
 
Zurück
Oben