Ankündigung

Einklappen
Keine Ankündigung bisher.

viele "or" statements kürzer schreiben

Einklappen

Neue Werbung 2019

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

  • viele "or" statements kürzer schreiben

    Mir ist klar, das folgendes eine Anfängerfrage ist, aber bitte nicht schimpfen, ich bin Anfänger.
    Die Situation:
    Ich vergleiche eine Variable $variable_x mit einer Reihe anderer Variablen $variable_1, $variable_1, $variable_2,....,$variable_n,
    welche alle verschieden sind.
    Bei Übereinstimmung soll ein bestimmter Befehlssatz ausgeführt werden. Andernfalls soll eine Meldung erscheinen, das keine Übereinstimmung besteht.

    Schematisch ausgedrückt: wenn (Übereinstimmung gefunden) {führe entsprechenden Befehlssatz aus}
    andernfalls {print $Meldung;}
    Soweit so simpel.

    Der Code:
    if ($variable_x == $variable_1) {Befehlssatz 1};
    if ($variable_x == $variable_2) {Befehlssatz 2};
    if ($variable_x == $variable_3) {Befehlssatz 3};
    if ( !(($variable_x == $variable_1) or ($variable_x == $variable_2) or ($variable_x == $variable_3)) )
    {print $Meldung;};
    Soweit immernoch simpel.

    Jetzt meine Frage:
    Mir erscheint obiges vernünftig bei 3 Variablen, aber was ist, wenn ich z.B. 100 davon habe?
    Dann hätte ich 100 Zeilen code für Übereinstimmung??
    Dann müsste ich Nicht-Übereinstimmung mit 1 Zeile Code mit 100 mal "or" checken? Ich wette das ist typischer Anfänger-Humbug
    und lässt sich irgendwie als Schleife oder Funktion machen. Aber ich kriege es nicht gebacken. Habe mich in loop und case angelesen,
    bekomme es aber nicht hin. Ist das die richtige Spur? Ich habe schon mal die vielen ifs als case/switch geschrieben. Das funktioniert, aber wirklich kürzer ist es auch nicht.
    Vielen Dank für Eure Hilfe!
    (Ich lese alles, antworte aber mit ein paar Stunden Verzögerung heute; es ist jetzt tiefe Nacht)

  • #2
    Dafür gibt es Arrays und Schleifen.
    [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

    Kommentar


    • #3
      if ($variable_x == $variable_1) {Befehlssatz 1};
      if ($variable_x == $variable_2) {Befehlssatz 2};
      if ($variable_x == $variable_3) {Befehlssatz 3};
      Erstens: Die Wiederholung dieser Zeilen ist nur sinnvoll, wenn in $variable_n und $variable_m der selbe Wert stehen kann
      if ( !(($variable_x == $variable_1) or ($variable_x == $variable_2) or ($variable_x == $variable_3)) )
      {print $Meldung;};
      Zweitens diese Zeile kann man vereinfachen, indem man in den Bedingungen ob eine Variable setzt und diese hier nur noch abfragt.

      Mehr kann man im Prinzip nicht sagen, weil der Code zu abstrakt ist.
      [COLOR="#F5F5FF"]--[/COLOR]
      [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
      [COLOR="#F5F5FF"]
      --[/COLOR]

      Kommentar


      • #4
        Schau dir mal switch inklusive der Beispiele an.
        Die switch Anweisung entspricht in etwa einer Folge von if Anweisungen die jeweils den gleichen Ausdruck prüfen. Es kommt oft vor, dass man dieselbe Variable (oder denselben Ausdruck) gegen viele verschiedene mögliche Werte prüfen und abhängig davon unterschiedlichen Code ausführen möchte. Genau hierfür wurde die switch Anweisung eingeführt.

        Kommentar


        • #5
          Erstmal vielen Dank für die Hilfe soweit. Ich werde heute daran weiterarbeiten, aber vorab schon mal folgendes:

          @jspit: Danke für den Tip mit case/switch. Ich hatte das probiert, aber ohne Erfolg.
          Die switch Anweisung entspricht in etwa einer Folge von if Anweisungen die jeweils den gleichen Ausdruck prüfen >>>hab ich soweit verstanden.

          Es kommt oft vor, dass man dieselbe Variable (oder denselben Ausdruck) gegen viele verschiedene mögliche Werte prüfen und abhängig davon unterschiedlichen Code ausführen möchte. >>>gut, genau das will ich

          Genau hierfür wurde die switch Anweisung eingeführt.>>>Also versuche ich das jetzt. Ich habe die Variablen umbenannt, da sie E-Mail-Adressen repräsentieren (Aber meine Frage ist genereller Natur, die Variablen könnten also auch für andere Dinge stehen).

          Anstatt der folgenden 5 Zeilen (falls ich 5 Variablen hätte):

          if ($email == $email_1) {Befehlssatz 1};
          if ($email == $email_2) {Befehlssatz 2};
          if ($email == $email_3) {Befehlssatz 3};
          if ($email == $email_4) {Befehlssatz 4};
          if ($email == $email_5) {Befehlssatz 5};

          schreibe ich:

          switch ($email) {
          case $email_1 :
          Befehlssatz 1;
          break;
          case $email_2:
          Befehlssatz 2;
          break;
          case $email_3:
          Befehlssatz 3;
          break;
          case $email_4:
          Befehlssatz 4;
          break;
          case $email_5:
          Befehlssatz 5;
          break;
          }
          Erstens mal die Frage: das richtig?
          Zweitens, für mich gibt es zwei Probleme. 1) Ich wollte den Code reduzieren, stattdessen habe mehr Zeilen als zuvor.
          2) Ich weiß nicht wie ich case/switch anwenden könnte, wenn keine Gleichheit besteht.

          @Nikosch:
          Danke für deinen Tip Folgendes: "Die Wiederholung dieser Zeilen ist nur sinnvoll, wenn in $variable_n und $variable_m der selbe Wert stehen kann" verstehe ich nicht. Warum ist das so? Es sind (in diesem Fall) keine gleichen Werte erlaubt, denn es handelt sich um Emailadressen, welche ja eindeutig sind.)

          und: "Zweitens diese Zeile kann man vereinfachen, indem man in den Bedingungen ob eine Variable setzt und diese hier nur noch abfragt." >>>Kannst Du dazu bitte konkreter sein? Ich denke, das ist genau das was ich will, das würde helfen, hab's bisher nicht hinbekommen.

          Kommentar


          • #6
            Zitat von Ignazius Beitrag anzeigen
            Zweitens, für mich gibt es zwei Probleme. 1) Ich wollte den Code reduzieren, stattdessen habe mehr Zeilen als zuvor.
            2) Ich weiß nicht wie ich case/switch anwenden könnte, wenn keine Gleichheit besteht.
            1. Wieso? Dein Ziel sollte möglichst gute Lesbarkeit, nicht möglichst kleiner Quelltext sein. Das kurzer Quelltext nicht unbedingt für einfach steht kannst du leicht herausfinden wenn du z.B. mal nach "code golf" suchst.
            2. Switch fragt den Wert einer Variable ab. Der Vergleich ist dabei immer ==. Wenn du mehr Flexibilität brauchst nimmt if/elseif/else.

            Ansonsten: Wenn du so viele Variablen bzw. Werte zu vergleichen hast sollte man das dynamisch machen, nicht jede Abfrage statisch. Aber da kennen wir den Anwendungsfall zu wenig um echte Hilfe geben zu können.

            Kommentar


            • #7
              Erstens mal die Frage: das richtig?
              Ja, wobei es eben streng genommen nicht dasselbe ist. Bei deinem if-Beispiel kann – in Bezug auf die Logik der Kontrollstruktur(en) – im Extremfall jede Bedingung nacheinander erfüllt sein (wenn in $email und $email_1 bis $email_n jeweils der gleiche Wert steht). Es kann also mehr als ein Befehlssatz pro Durchlauf ausgeführt werden. Das switch-Konstrukt verhält sich wie ein elseif, es wird maximal ein Befehlssatz ausgeführt, weil nach dem ersten Treffer der Rest übersprungen wird.

              Das Äquivalent zum else ist bei switch-case der default-Case. Diese beiden Blöcke verhalten sich gleich:

              PHP-Code:
              if ($var == 1) {
                  
              // 1
              } elseif ($var == 2) {
                  
              // 2
              } else {
                  
              // 3
              }

              switch (
              $var) {
                  case 
              1:
                      
              // 1
                      
              break;
                  case 
              2:
                      
              // 2
                      
              break;
                  default:
                      
              // 3
                      
              break;

              "Die Wiederholung dieser Zeilen ist nur sinnvoll, wenn in $variable_n und $variable_m der selbe Wert stehen kann" verstehe ich nicht.
              Du solltest elseif nutzen statt einer Latte unabhängiger if-Zeilen, von denen ohnehin immer nur eine Bedingung erfüllt ist. Das ist wesentlich besser lesbar und spart auch ein paar sinnlose Vergleiche bei der Ausführung.

              und: "Zweitens diese Zeile kann man vereinfachen, indem man in den Bedingungen ob eine Variable setzt und diese hier nur noch abfragt." >>>Kannst Du dazu bitte konkreter sein? Ich denke, das ist genau das was ich will, das würde helfen, hab's bisher nicht hinbekommen.
              Denke, das ist so gemeint:

              PHP-Code:
              $hit false;

              if (
              $variable_x == $variable_1) { Befehlssatz 1$hit true; }
              if (
              $variable_x == $variable_2) { Befehlssatz 2$hit true; }
              if (
              $variable_x == $variable_3) { Befehlssatz 3$hit true; }

              if (
              $hit === false) {
                  
              // Kein Befehlssatz ausgeführt

              Das brauchst du aber nicht, wenn du elseif und else nutzt (oder eben switch-case oder so).

              Kommentar


              • #8
                Prima, jetzt kommen wir voran!

                @Tropi
                " Wieso? Dein Ziel sollte möglichst gute Lesbarkeit, nicht möglichst kleiner Quelltext sein".
                >>>Danke, guter Punkt, für einen Anfänger sicher umsomehr. Ich versuche auch, las lesbar zu halten, nur üassiert es mir öfter (s wie hier) das ich z.B. 100 Zeilen Code habe der fast identisch ist, und dann
                habe ich oft das Gefühl, das sei ein Anfängerfehler und man müsste das irgendwie (und hier haperts bei mir noch) in einer Zeile schreiben und dann da durchloopen
                Anmerkung
                " Aber da kennen wir den Anwendungsfall zu wenig um echte Hilfe geben zu können."
                >>> Ihr habt schon etwas geholfen, danke!

                @mermshaus: Danke, super. Jetzt verstehe ich, was Nikosch meinte. Diese extra Variable $hit macht zwar den ersten Teil, den Variablenabgleich, nicht kürzer, reduziert aber den zweiten, das heißt ich brauche nicht mehr die vielen "or" zu benutzen und es ist genaus klar und übersichtlich, eigentlich noch mehr. Sehr gut

                Und: "...
                und spart auch ein paar sinnlose Vergleiche bei der Ausführung."
                ist auch ein guter Hinweis. Aber, wenn ich if-else-else if benutze, würde ich dann bei sagen wir mal 100 Variablen nicht ein if in das nächste verschachteln müssen und so weiter und lande im Prinzip bei so etwas wie :
                if (if(if(if(if(if(if..............)))))).
                Und bei 100 Variablen 100 mal )))))))))...)))) am Ende ???
                Das wäre dann ja auch nicht sehr elegant. Allerdings könnte ich dann wenigstens die $email-Variablen so ordnen, dass die am wahrscheinlichsten vorkommenden an Amfang stehen.

                Daher noch mal die Frage, kann man den ersten Teil, den Abgleich auch kürzer schreiben? Durchloopen? Aber wie? Oder ist das naiv und es geht gar nicht?

                Kommentar


                • #9
                  das ich z.B. 100 Zeilen Code habe der fast identisch ist
                  Of all the principles of programming, Don't Repeat Yourself (DRY) is perhaps one of the most fundamental.
                  http://programmer.97things.oreilly.c...epeat_Yourself

                  Daher noch mal die Frage, kann man den ersten Teil, den Abgleich auch kürzer schreiben
                  Hast du mal ein konkretes Beispiel, die Lösung dafür kommt imho sehr darauf an.
                  The string "()()" is not palindrom but the String "())(" is.

                  Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                  PHP.de Wissenssammlung | Kein Support per PN

                  Kommentar


                  • #10
                    if (if(if(if(if(if(if..............)))))).
                    Und bei 100 Variablen 100 mal )))))))))...)))) am Ende ???
                    Dafür gibt es elesif, s. Beispiel mermshaus.

                    Wenn dein Befehlssatz1..n fast identischen Code enthält, lohnt es eine Funktion zu schreiben welche entsprechende Parameter entgegennimmt. Auch für die Variante ist ein konkretes Beispiel wichtig.

                    Kommentar

                    Lädt...
                    X