Ankündigung

Einklappen
Keine Ankündigung bisher.

Multidimensionales Array

Einklappen

Neue Werbung 2019

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

  • Multidimensionales Array

    Hi,

    ich bräuchte eine kurze Unterstützung von euch.

    Ich übergebe den Inhalt eines Textfeldes an eine php-Datei. Dann les ich die ganze Geschichte aus wie folgt:
    PHP-Code:
    if(isset($_POST['data'])){
    preg_match_all ('#([äöüÄÖÜ\w]+)\s*(\d+)#m'$_POST['data'] , $found PREG_SET_ORDER);


    }
                              
     foreach (
    $found as $v1) {
        foreach (
    $v1 as $v2) {
            echo 
    "$v2\n";
        }

    Ich hab mir das bisher aus diversen Anleitungen und Foren zusammengesucht. Leider erhalte ich nicht genau das Ergebnis dass ich haben möchte.

    Eingegeben wird etwa: FC Bayern München 296.000.000 €.
    Am Ende möchte ich die beiden Werte "FC Bayern München" und die Zahl "296000000" in zwei Variablen stehen haben. Aktuell kommt er nicht damit zurecht, dass im Vereinsnamen Leerzeichen sind und genausowenig lassen sich die Punkte und das €-Zeichen verbannen. Ich schätze mal, des Rätsels Lösung liegt in der richtigen Angaben des Suchstrings oben. Leider steig ich bei dem Aufbau dieses Strings nicht wirklich durch.

    Vielleicht kann sich ja jemand meiner annehmen! Würde mich freuen! Danke im Voraus!


  • #2
    Na ja, trotz der Leerzeichen taucht in dem einen nur Buchstaben auf und im anderen Zahlen und Punkte (außer du hast Vereinsnamen, wie 1860München) - darauf kannste aufbauen. Warum ahst Du sowas nicht in einer Datenbank?

    Wolf29
    while (!asleep()) sheep++;

    Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

    Kommentar


    • #3
      Dann füg der Zeichenklasse doch noch ein Leerzeichen hinzu.
      Code:
      [äöüÄÖÜ\w\s]+
      Die Punkte musst du dann eben auch zulassen oder vorher aus der Zahl entfernen. Das Eurozeichen kannst du als alternatives Zeichen kennzeichnen (?-Operator).
      http://hallophp.de

      Kommentar


      • #4
        Zitat von funille Beitrag anzeigen
        Leider steig ich bei dem Aufbau dieses Strings nicht wirklich durch.
        Dann wollen wir mal:

        Code:
        '#([äöüÄÖÜ\w]+)\s*(\d+)#m'
        Der String beginnt mit #, damit ist das dein Delimiter, der das Pattern einschließt. Nach dem abschließenden # kommen Modifier [1], in deinem Fall m, um den String über mehrere Zeilen zu prüfen (für dein Beispiel eigentlich unnötig!)

        ([äöüÄÖÜ\w]+) bedeutet ein oder mehrere Zeichen (+) aus der Menge [äöüÄÖÜ\w] (Umlaute und "word characters", sprich Zahlen, Buchstaben und Unterstrich[2]. Mit den richtigen Lokalisierungseinstellungen sollte es übrigens nicht nögit sein, Umlaute explizit anzugeben, da sie im Deutschen auch als word characters gelten), durch die Klammern hast du diesen Teil nachher in $found enthalten.

        \s* bedeutet beliebig viele oder keine (*)whitespace characters (Leerzeichen, Tabulator, Zeilenumbruch, ...) [2]

        (\d+) bedeutet ein oder mehrere (+) Ziffern, zu den Klammern siehe oben.

        Wenn du das verstanden hast, sollte es dir möglich sein, den Ausdruck deinen Bedürfnissen anzupassen, um beispielsweise Punkte in dem Geldbetrag zu erlauben:

        Code:
        ([\d\.]+)
        beachte, dass der Punkt eine besondere Bedeutung hat [3] und er deshalb wenn wirklich ein Punkt gemeint ist mit \ escaped werden muss.

        [1] PHP: Possible modifiers in regex patterns - Manual
        [2] PHP: Escape sequences - Manual
        [3] PHP: Meta-characters - Manual
        @fschmengler - @fschmengler - @schmengler
        PHP Blog - Magento Entwicklung - CSS Ribbon Generator

        Kommentar


        • #5
          Der Punkt selbst hat in einer Zeichenklasse keine Bedeutung und muss darin nicht escaped werden.
          http://hallophp.de

          Kommentar


          • #6
            Zitat von fab Beitrag anzeigen
            beachte, dass der Punkt eine besondere Bedeutung hat [3] und er deshalb wenn wirklich ein Punkt gemeint ist mit \ escaped werden muss.
            Ausnahme: in einer Character Class ([]) muß ein Punkt nicht escaped werden. z.B. [\w.]

            Kommentar


            • #7
              danke schon mal soweit!

              @wolf29: ich möchte die werte in meiner datenbank mittels copy&paste aktualisieren. für die vorhandenen problemstellung ist das ne gute lösung. guter einwand übrigens mit dem aus zahlen und buchstaben zusammengesetzten vereinen - was ist dann damit?

              @fab: danke für die umfangreiche erklärung, das hab ich soweit verstanden. trotzdem schaff ichs nicht ganz, die gewünschten werte zu finden.

              die punkte und euro-zeichen hab ich jetzt erst mal verbannt, somit gilt es dann nur noch die vereinsnamen und die zahlen rauszufiltern.

              hab dann mal ein bisschen rumprobiert und eigentlich sollte es ja damit:
              PHP-Code:
              '#([\w\s]+)(\d+)#' 
              getan sein, oder? funktioniert aber nicht. ich dachte, die klammern geben mir die möglichkeit nach verschiedenen strings zu suchen. somit suche ich dann ja hier nach nem ausdruck, der nur word characters und leerzeichen enthält (vereinsname) und andererseits nach einer zahl.

              als resultat wird aber einfach alles aneinander gehängt...

              suchen über mehrere zeilen ist nötig, es sollen in diese textbox ja mehrere vereine gleichzeitig eingetragen werden.

              Nochmal etwas ausführlicher. Ich gebe z.B. ein:
              FC Bayern München 269000000
              SV Werder Bremen 140000000
              etc.
              Als Ergebnis dann halt:
              Name1 = "FC Bayern München", Wert1 = "269000000"
              Name2 = "SV Werder Bremen", Wert2 = "140000000"
              etc.

              Und dann ist ja noch die Sache (wie von Wolf angesprochen) mit den Vereinen wie 1860 München... da wirds dann wohl nochmal komplizierter.

              Kommentar


              • #8
                Zitat von Asipak Beitrag anzeigen
                Der Punkt selbst hat in einer Zeichenklasse keine Bedeutung und muss darin nicht escaped werden.
                Oh, da sagst du was.. naja besser einmal zu viel als zu wenig, schaden tut es ja nicht
                @fschmengler - @fschmengler - @schmengler
                PHP Blog - Magento Entwicklung - CSS Ribbon Generator

                Kommentar


                • #9
                  Um dem ganzen mal eine andere Wendung zu geben: Warum quetscht du das alles in ein einiges Eingabefeld? Ein Formular darf ja auch mehrere Felder besitzen.

                  Zu empfehlen ist eine Mysql-Tabelle, in der die benötigten Vereine so stehen:
                  id name
                  1 Werder Bremen
                  2 Bayern München
                  3 HSV
                  usw.
                  Daraus kannst du mit SELECT id,name FROM vereine eine Selectbox bauen, aus der du den gewünschten Verein auswählst, wodurch Tippfehler beim Vereinsnamen ausgeschlossen werden. Dahinter ein normales Inputfeld für die Zahl und schon ist der Fisch gegessen.
                  PHP-Code:
                  if ($var != 0) {
                    
                  $var 0;

                  Kommentar


                  • #10
                    Zitat von funille Beitrag anzeigen
                    hab dann mal ein bisschen rumprobiert und eigentlich sollte es ja damit:
                    PHP-Code:
                    '#([\w\s]+)(\d+)#' 
                    getan sein, oder? funktioniert aber nicht. ich dachte, die klammern geben mir die möglichkeit nach verschiedenen strings zu suchen. somit suche ich dann ja hier nach nem ausdruck, der nur word characters und leerzeichen enthält (vereinsname) und andererseits nach einer zahl.

                    als resultat wird aber einfach alles aneinander gehängt...
                    Was heißt, alles aneinandergehängt? Dadurch dass die Vereine in verschiedenen Zeilen stehen und du den m-Modifier nicht mehr benutzt, kann ja schonmal nicht alles zusammen gematcht werden. Das Problem ist hier, dass reguläre Ausdrücke per default "greedy" sind, also jeder Teilausdruck versucht, so viele Zeichen wie möglich zu matchen. Da du in deiner ersten Klammer sowohl Zahlen als auch Whitespaces erlaubst, holt der sich gierigerweise "FC Bayern München 26900000", für die Zweite Klammer bleibt dann ja noch "0" übrig, passt. Setze mal zwischen die Klammern ein Leerzeichen, damit klar ist, wann Schluss ist mit dem Verein (nämlich beim letzten Leerzeichen)

                    Edit: Zur Erinnerung, word characters beinhalten sowohl Zeichen als auch Ziffern!
                    @fschmengler - @fschmengler - @schmengler
                    PHP Blog - Magento Entwicklung - CSS Ribbon Generator

                    Kommentar


                    • #11
                      Zitat von Wolla Beitrag anzeigen
                      Um dem ganzen mal eine andere Wendung zu geben: Warum quetscht du das alles in ein einiges Eingabefeld? Ein Formular darf ja auch mehrere Felder besitzen.

                      Zu empfehlen ist eine Mysql-Tabelle, in der die benötigten Vereine so stehen:
                      id name
                      1 Werder Bremen
                      2 Bayern München
                      3 HSV
                      usw.
                      Daraus kannst du mit SELECT id,name FROM vereine eine Selectbox bauen, aus der du den gewünschten Verein auswählst, wodurch Tippfehler beim Vereinsnamen ausgeschlossen werden. Dahinter ein normales Inputfeld für die Zahl und schon ist der Fisch gegessen.
                      weil ich kein bock auf manuelle eingabe der werte hab. klar könnte ich das auch so machen und das wäre schnell gelöst. ich möchte aber einfach per copy&paste die werte automatisch einfügen und nicht persönlich den vereinen zuordnen müssen. es wird ja dann anschließend auch noch alles in einer tabelle gespeichert und weiterverarbeitet.

                      Kommentar


                      • #12
                        hehe... ne, ich kapier´s nicht. hab noch auf ein paar anderen seiten gestöbert, aber das bringt alles nix. entweder ich hab probleme, dass der vereinsname zahlen enthält, die dann auch noch manchmal vorne (1899 hoffenheim) manchmal hinten sind (schalke 04). ich weiß echt beim besten willen nicht weiter. entweder hat jemand noch ne idee, oder ich muss es doch anders probieren.

                        danke trotzdem!

                        Kommentar


                        • #13
                          Zitat von fab Beitrag anzeigen
                          Setze mal zwischen die Klammern ein Leerzeichen, damit klar ist, wann Schluss ist mit dem Verein (nämlich beim letzten Leerzeichen
                          Hast du das probiert?
                          @fschmengler - @fschmengler - @schmengler
                          PHP Blog - Magento Entwicklung - CSS Ribbon Generator

                          Kommentar


                          • #14
                            ja, hab ich. kommt dann für folgenden datensatz:
                            Bayern München 269000000
                            VfL Wolfsburg 170000000
                            FC Schalke 04 500000000

                            das hier raus:
                            Array (
                            [0] => Array (
                            [0] => Bayern München 269000000 VfL Wolfsburg 170000000 FC Schalke 04 500000000
                            [1] => Bayern München 269000000 VfL Wolfsburg 170000000 FC Schalke 04
                            [2] => 500000000 )
                            )

                            das bringt nur leider gar nichts...

                            Kommentar


                            • #15
                              Nur zwecks der Vollständigkeit. Beim ursprünglichen Code
                              PHP-Code:
                              if(isset($_POST['data'])){
                              preg_match_all ('#([äöüÄÖÜ\w]+)\s*(\d+)#m'$_POST['data'] , $found PREG_SET_ORDER);
                              print_r ($found); 


                              kommt das hier raus:
                              Code:
                              Array ( 
                              	[0] => Array ( 
                              		[0] => München 269000000 
                              		[1] => München 
                              		[2] => 269000000 ) 
                              	[1] => Array ( 
                              		[0] => Wolfsburg 170000000 
                              		[1] => Wolfsburg 
                              		[2] => 170000000 ) 
                              	[2] => Array ( 
                              		[0] => Schalke 04 
                              		[1] => Schalke 
                                              [2] => 04 ) 
                              	[3] => Array ( 
                              		[0] => 500000000 
                              		[1] => 50000000 
                              		[2] => 0 ) )
                              macht halt irgendwie auch kein sinn, vor allem eben dann wenn der vereinsnamen zahlen enthält... ist aber dennoch besser als alles andere was ich ausprobiert habe. den vereinsnamen (wenn auch nicht komplett) hab ich etwa in $array[0][1] und wert dazu in $array[0][2] (für München).

                              Kommentar

                              Lädt...
                              X