Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] String zerlegen und auswerten

Einklappen

Neue Werbung 2019

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

  • [Erledigt] String zerlegen und auswerten

    Guten Tag liebe PHPler,

    ich möchte gerne einen per Formular übergeben String zerlegen und auswerten.

    Da die Strings ständig in der Länge wechseln weiss ich nciht wie. Ich habe es einmal mit explode versucht, bin jedoch gescheitert.

    Vielleicht hat hier jemand einen Denkanstoss für mich.

    Hier drei Beispiele:

    > Spieler ABC rollt die Würfel...
    25W100: 30, 22, 35, 4, 27, 99, 2, 85, 74, 54, 8, 49, 86, 1, 42, 34, 47, 24, 64, 17, 38, 34, 85, 49, 3 = 1013
    ---------
    > Spieler DEF rollt die Würfel...
    10W100: 73, 10, 69, 94, 70, 16, 28, 66, 43, 96 = 565
    ---------
    > Spieler XYZ rollt die Würfel...
    2W100: 40, 8 = 48


    Nun soll der Name des Spielers in die Datenbank gespeichert werden. Dazu soll die Die Zahl vor dem W in die Datenbank gespeichert werden bzw mit dem dort vorhandenen Wert addiert werden. Das W100: muss nicht beachtet werden jedoch danach müssen alle durch Kommas getrennten Zahlen getrennt werden werden und einzeln ausgewertet werden. Das =XXX muss ebenfalls nciht beachtet werden.

    Das wichtigste sind dabei die Augenzahlen der einzelnen Würfel, da diese einen gewissen Wert unterschreiten müssen. Man könnte dies zwar auch per Hand machen aber per Script ist es dann doch leichter.

    Ich hoffe es war einigermaßen verständlich ansonsten fragt doch bitte nochmal nach oder sagt das ich es nochmal ausführlich erklären soll =)

    Was ich versucht hatte war zb.

    Den String in ein Formular und dann via folgendem Code auswerten.

    $tagsAsString = $_POST["Würfel"];
    $tagsAsArray = explode(',', $_POST["Würfel"]);
    var_dump($_POST["Würfel"]);

    leider hat dies nciht funktioniert und da ich relativ wenige Kenntnisse habe stecke ich fest.

    Liebe Grüße,
    Helix

  • #2
    PHP-Code:
    <?php

    $string 
    'Spieler ABC rollt die Würfel...
    25W100: 30, 22, 35, 4, 27, 99, 2, 85, 74, 54, 8, 49, 86, 1, 42, 34, 47, 24, 64, 17, 38, 34, 85, 49, 3 = 1013'
    ;

    $lines explode(PHP_EOL$string);

    $name explode(' '$lines[0])[0]; // Funktioniert nur bei Spielern ohne Leerzeichen im Namen
    $zahlVorW explode('W'$lines[1])[0];

    $nummern explode(', '$lines[1]);
    $nummern[0] = explode(' '$nummern[0])[1];
    $nummern[count($nummern) - 1] = explode(' '$nummern[0])[0];

    var_dump($name);
    var_dump($zahlVorW);
    var_dump($nummern);
    Achja, was mit explode alles geht. Aber dafür müssen die texte wirklich immer gleich aussehen.

    http://sandbox.onlinephpfunctions.co...ab7119414cb6b0

    Kommentar


    • #3
      Danke schon einmal, das mit den Leerzeichen im Namen lässt sich leider nicht vermeiden. Diese können aber manuell durch ein anderes Zeichen ersetzt werden, das geht relativ schnell.

      Also definitiv sehen sie immer gleich aus, jeder hat XW100: XX, XX, XX, = XX, nur die Länge ändert sich. und davor steht jedesmal Spieler ABC rollt die Würfel... bzw Eigentlich kein Spieler ABC sondern lediglich der Nickname(ohne Spieler).

      Danke aufjedenfall, das hilft mir schonmal, und ein bisschen mag ich auch alleine machen, alles vorsagen lassen ist auch doof und ich lerne dabei nicht soviel =)

      Kommentar


      • #4
        Mich wundert nur, woher die Daten kommen...
        Weil so ist das konstrukt einfach nicht robust. Besser wärs Daten wie Username etc. separat zu übertragen.

        Ich weiß außerdem auch nicht, wie PHP mit Umlauten im Assoziativen POST-Array umgeht, aber normal benutzt man die nicht.
        Stichwort Wuerfel und nicht Würfel.
        Current Projects: http://www.welten-buch.de, http://neu.zooadoo.de

        Kommentar


        • #5
          http://sandbox.onlinephpfunctions.co...d07f3d4ee55be0

          Dann halt so...

          Und wenn du es selber probieren willst. Es geht mit regulären Ausdrücken, respektive dieser Funktion: http://php.net/manual/de/function.preg-match.php

          Kommentar


          • #6
            Das ganze kommt aus einem Chat, ich habe da einen Spielechat. Es geht darum das der Spieler mit einer gewissen Anzahl an 100seitigen Würfeln (1-25 Stk) , also W100, unter unter eine gewisse Augenzahl wirft, in der ersten Stufe unter 80.

            Dazu muss ich jeden Würfel auswerten und schauen welcher unter 80 ist, danach wir mit denen die darunter sind Stufe zwei erreicht, wenn also von 25 Würfeln 8 Stk unter 80 sind würfelt man in Stufe zwei mit 8 Stk weiter und muss unter 70 kommen. Das manuell auszuwerten ist ne riesen Arbeit und dauert ewig wenn man mehrere Leute betreuen muss.

            Zu dem umlaut, dieser wird nicht gespeichert, Den Nick könnte ich gegebenenfalls manuell kopieren, das wäre nciht der wichtigste Punkt, der wichtigste Punkt ist das auswerten der Würfe.

            Kommentar


            • #7
              PHP-Code:
              $tagsAsString $_POST["Würfel"]; 
              Ich meinte den hier.
              Current Projects: http://www.welten-buch.de, http://neu.zooadoo.de

              Kommentar


              • #8
                ah, okay ^^ Ja da könnte ein Fehler der vielen gesteckt haben, danke dir für diesen Hinweis =)

                Kommentar


                • #9
                  Alternativ wenn wir schon mit RegEx'es schießen:
                  PHP-Code:
                  $s 'Spieler A BC rollt die Würfel...
                  25W100: 30, 22, 35, 4, 27, 99, 2, 85, 74, 54, 8, 49, 86, 1, 42, 34, 47, 24, 64, 17, 38, 34, 85, 49, 3 = 1013'
                  ;

                  $arr preg_split('~(, |W100:|Spieler | rollt[^\d]+| =.+)~',$s,null,PREG_SPLIT_NO_EMPTY);
                  $spieler array_shift($arr);
                  $zahl_vor_W array_shift($arr);

                  var_dump($spieler$zahl_vor_W$arr); 

                  Kommentar


                  • #10
                    Dann können wir auch richtig schießen...

                    PHP-Code:
                    preg_match_all('~Spieler (?P<spieler>.*?) rollt die Würfel...(?:\v*)(?P<w_number>[\d]*)W100: (?P<numbers>[\d, ]*) = ~',$s$resultPREG_SET_ORDER);

                    foreach(
                    $result AS $daten) {
                       echo 
                    $daten['spieler'].' '.$daten['w_number'].' '.$daten['numbers']."\n";

                    Kommentar


                    • #11
                      jspit, wie unterscheide ich nun zwischen den Strings, das Array ist soweit klar, aber die Strings sind nicht zu unterscheiden, da die gleiche definition. Kenne mich damit nicht aus. So eine Ausgabe bekam ich noch nie.

                      Und gibt es eine einfache Möglichkeit gleich ein ganzes array auf Zahlen unter einem bestimmten Wert zu Prüfen als jede einzeln?

                      Kommentar


                      • #12
                        @erc

                        Deinen code versteh ich leider mal gar nciht, tut mir leid, dafür bin ich noch zusehr anfänger

                        Kommentar


                        • #13
                          Du könntest dir eine Funktion machen, z.B. so:
                          PHP-Code:
                          function amountBelowThreshold(array $array$threshold 30) {
                              
                          $amount 0;
                              foreach (
                          $array as $element) {
                                  if (!
                          is_numeric($element)) {
                                      
                          // Was tun falls Element keine Zahl? z.B. Fehlermeldung, überspringen, etc.
                                      
                          continue; // skip
                                  
                          }
                                  if (
                          $element $threshold) {
                                      
                          $amount++;
                                  }
                              }
                              
                              return 
                          $amount;

                          Gibt dir die Anzahl der Elemente die unter dem Limit (default: 30) liegen. (Ungetestet btw.)

                          Kommentar


                          • #14
                            Funktioniert nicht oder ich habe es falsch eingesetzt:

                            PHP-Code:
                            $s '>ABCDEF rollt die Würfel...  
                            15W100: 30, 22, 35, 4, 27, 99, 2, 85, 74, 54, 8, 49, 86, 1, 42 = 875'
                            //$_POST["Name"]

                            $arr preg_split('~(, |W100:|Spieler | rollt[^\d]+| =.+)~',$s,null,PREG_SPLIT_NO_EMPTY); 
                            $spieler array_shift($arr); 
                            $zahl_vor_W array_shift($arr); 

                            var_dump($spieler$zahl_vor_W$arr);


                            function 
                            amountBelowThreshold($arr$threshold 30) {
                                
                            $amount 0;
                                foreach (
                            $arr as $element) {
                                    if (!
                            is_numeric($element)) {
                                        
                            // Was tun falls Element keine Zahl? z.B. Fehlermeldung, überspringen, etc.
                                        
                            continue; // skip
                                    
                            }
                                    if (
                            $element $threshold) {
                                        
                            $amount++;
                                    }
                                }
                                
                                return 
                            $amount;

                            Kommentar


                            • #15
                              Zitat von lordhelix Beitrag anzeigen
                              @erc
                              Deinen code versteh ich leider mal gar nciht, tut mir leid, dafür bin ich noch zusehr anfänger
                              Da sind Sachen drin (?P), die kannte ich auch noch nicht, hab so etwas aber schon öfter mal gesucht.
                              @erc : Top!

                              Zitat von lordhelix Beitrag anzeigen
                              jspit, wie unterscheide ich nun zwischen den Strings, das Array ist soweit klar, aber die Strings sind nicht zu unterscheiden, da die gleiche definition.
                              Von welchen Strings redest du? Benenne mal ein Beispiel.

                              Zitat von lordhelix Beitrag anzeigen
                              Und gibt es eine einfache Möglichkeit gleich ein ganzes array auf Zahlen unter einem bestimmten Wert zu Prüfen als jede einzeln?
                              Möchtest du nur wissen ob eine oder mehrere Zahlen unter einem bestimmten Wert liegen? Das geht mit min().

                              Edit: Das letzte hat sich erledigt, hab die letzten Post nicht gesehen. Du mußt tropis funktion auch aufrufen!

                              Kommentar

                              Lädt...
                              X