Ankündigung

Einklappen
Keine Ankündigung bisher.

Strings numerisch umwandeln

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

  • 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.


  • #2
    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/
    PHP-Code:
    if ($var != 0) {
      
    $var 0;

    Kommentar


    • #3
      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.

      Kommentar


      • #4
        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.
        PHP online testen, zum Beispiel: md5, base64_decode, preg_match, urldecode und viele weitere...

        Kommentar


        • #5
          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..

          Kommentar


          • #6
            Bei gleich langen Zeichenketten (alles klein geschrieben) funktioniert es doch..
            Dann mach alle Zeichenketten gleich lang.
            PHP-Code:
            if ($var != 0) {
              
            $var 0;

            Kommentar


            • #7
              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.
              --

              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


              --

              Kommentar


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

                Kommentar


                • #9
                  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.
                  --

                  „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                  Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                  --

                  Kommentar

                  Lädt...
                  X