Ankündigung

Einklappen
Keine Ankündigung bisher.

Strings numerisch umwandeln

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • xm22
    hat ein Thema erstellt Strings numerisch umwandeln.

    Strings numerisch umwandeln

    Hallo,

    ich weiß nicht, ob das in diesem Bereich gut aufgehoben ist, da es eigentlich um einen Algorithmus geht. Ich habe bisher nichts dazu gefunden, vielleicht habe ich auch nur nach dem falschen gesucht. Das Problem ist folgendes: Ich will Sphinx für eine Volltextsuche nutzen, die Ergebnisse sollen aber alphabetisch sortiert werden. Kurze Info: Sphinx unterstützt zur Sortierung nur sog. Attribute und die dürfen nur ganzzahlig sein. Jetzt versuche ich, einen Algorithmus zu finden, der numerisch die alphabetische Sortierung von Strings abbildet. Allerdings bin ich zu schlecht in Mathe, um prüfen zu können, ob das überhaupt geht.

    Ich habe einen Ansatz, der allerdings nur funktioniert, wenn alle Strings die selbe Länge haben:

    PHP-Code:
    function str2Ordinal($str) {
            
    $length mb_strlen($str'utf-8');
            
    $sum 0;
            for (
    $i 0$i $length; ++$i) {
                
    $char  mb_substr($str$i$i 1);
                
    $value = ($length $i)*10*ord($char);
                
    $sum += $value;
            }

            return 
    $sum;
        } 
    Diese Funktion geht alle Buchstaben eines Strings durch und multipliziert den Ord-Wert eines jeden Zeichens mit einer absteigenden Zahl * 10. So ist gewährleistet, dass die vorderen Zeichen stärker gewichtet sind, als die hinteren.
    Das Problem tritt bei unterschiedlich langen Strings auf. Bsp.:

    "b"
    hat einen niedrigeren Wert als
    "aaaaa",

    was zu einer falschen Sortierung führen würde. Problematisch ist, dass ich vorher nicht weiß, wie lang der längste String ist.

    Jetzt würde ich gerne wissen, ob mir jemand sagen kann, ob das rechnerisch überhaupt lösbar ist.

  • nikosch
    antwortet
    Naja, kommt drauf an, wo Du sie haben willst. Hab die konkreten Ascii-Nummern jetzt nicht im Kopf, das oben waren Beispiele. Der Grundansatz ist:
    Jedes Zeichen bekommt eine 2-stellige Nummer, die werden dann aneinandergereiht und rechtsbündig mit einer festen Anzahl von Nullen aufgefüllt. Ist halt bloß die mathematische Variante.

    Einen Kommentar schreiben:


  • xm22
    antwortet
    Wieso diese Vorgehensweise? Da blicke ich nicht durch. Außerdem müsste doch die 0 dann eine kleinere Zahl haben als "aa" bzw. "ab"..?

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Benutz eine sehr lange Ausgangszahl.

    Bsp.
    a=46
    b=47
    0=90

    aa=4646 * 100000000000 / 10^strlen(4646) = 46460000000
    ab=4647 = 46470000000
    0=90 * 100000000000 / 10^strlen(90) = 90000000000

    Das Problem ist, dass die Zahlen gigantisch werden. Du könntest Dich auf eine bestimmte Länge beschränken oder alle verwendeten Satzzeichen zusätzlich auf eine Map mit kleineren Werten abbilden und dann bspw. in einem anderen Zahlensystem rechnen.

    Einen Kommentar schreiben:


  • Wolla
    antwortet
    Bei gleich langen Zeichenketten (alles klein geschrieben) funktioniert es doch..
    Dann mach alle Zeichenketten gleich lang.

    Einen Kommentar schreiben:


  • xm22
    antwortet
    aber ord ist nicht Multibyte sicher.
    Das wusste ich nicht - ok.
    und richtig Multiplizieren nicht vergessen.
    ?
    Schreib dir einfach mal die Zahlen von ein paar Worten auf.
    Bei gleich langen Zeichenketten (alles klein geschrieben) funktioniert es doch..

    Einen Kommentar schreiben:


  • jabubo
    antwortet
    Deine Funktion hat mindestens einen Fehler. Du verwendest zwar mb_substr um ein einzelnes Zeichen zu haben, aber ord ist nicht Multibyte sicher.

    PHP-Code:
    echo ord('更'); 
    gibt dir 230 zurück. Das ist definitiv ein anderes Zeichen. Du solltest an der Stelle daher das Zeichen mit substr in seine maximal 4 Teile aufspalten und richtig Multiplizieren nicht vergessen.

    Generell kann ich mir nicht vorstellen, dass du über diesen einfachen Weg jemals zu einer Lösung kommen wirst. Schreib dir einfach mal die Zahlen von ein paar Worten auf. Damit ist keine sinnvolle Sortierung hinzubekommen. Du wirst immer Konflikte haben.

    Einen Kommentar schreiben:


  • xm22
    antwortet
    Wenn man keine Strings damit sortieren kann, dann klopp es in die Tonne.
    Das wäre die allerletzte Konsquenz, die ich aber gerne vermeiden würde, da die Vorteile enorm sind.
    In der Doku habe ich natürlich schon nach geschaut. In der Tat steht in der Doku ein Weg, den ich aber nicht verwenden kann. Unabhängig davon würde mich interessieren, wie so ein Algorithmus funktioniert, sofern es eine Lösung dafür gibt.

    Einen Kommentar schreiben:


  • Wolla
    antwortet
    Ohne das Ding jemals gesehen zu haben: Wenn man keine Strings damit sortieren kann, dann klopp es in die Tonne.
    Wahrscheinlich ist es aber so, dass die Lösung im Manual zu finden ist:
    http://sphinxsearch.com/docs/

    Einen Kommentar schreiben:

Lädt...
X