Harald: mehrfache if abfrage

Hallo,

kann mir bitte jemand sagen, wie ich die folgende if Abfrage um eine Option erweitere ?

Im Moment sieht diese so aus:

if ($_POST['Category'] == "Business/Finance/Banking" || $_POST['Category'] == "Business/Finance/Credit")

Jetzt sollen zusätzlich nur die Titel rausgefiltert werden, deren Anfangsbuchstaben A-M sind, also etwa so:

if ($_POST['Category'] == "Business/Finance/Banking" || $_POST['Category'] == "Business/Finance/Credit") AND if ($_POST['Title']  == "A-M")

Nur so funktioniert das leider nicht, da ich die korrekte Syntax nicht kenne. Wie sollte das richtig lauten ?

Danke

  1. Hi

    if ($_POST['Category'] == "Business/Finance/Banking" || $_POST['Category'] == "Business/Finance/Credit") AND if ($_POST['Title']  == "A-M")
    Nur so funktioniert das leider nicht, da ich die korrekte Syntax nicht kenne. Wie sollte das richtig lauten ?

    Das kommt drauf an, wie du die Bedingungen logisch miteinander verknüpfen willst - und das können wir nicht wissen. Generell ist in diesem Fall Klammern nicht schlecht. Bedenke, AND bindet mehr als OR.

    MfG
    Rick

  2. Hello,

    if ($_POST['Category'] == "Business/Finance/Banking" || $_POST['Category'] == "Business/Finance/Credit")

    Jetzt sollen zusätzlich nur die Titel rausgefiltert werden, deren Anfangsbuchstaben A-M sind, also etwa so:

    if ( (    ($_POST['Category'] == "Business/Finance/Banking")
           or ($_POST['Category'] == "Business/Finance/Credit")
         )
         AND ($_POST['Title']  == "A-M")
       )
    {
      ## nun darfst Du
    }

    Meinst Du so?
    Das 'if' muss innerhalb einer zusammengestzten Bedingung nicht wiederholt werden.

    Harzliche Grüße aus
    Sankt Andreasberg
    und Guten Rutsch

    Tom

    --
    Nur selber lernen macht schlau

    1. Hello,

      jetzt habe ich doch tatsächlich heute Nacht davon geträumt, dass ich diese Frage nicht fertig beantwortet habe... *tztz*  Dann will ich das mal schnell nachholen:

      if ($_POST['Category'] == "Business/Finance/Banking" || $_POST['Category'] == "Business/Finance/Credit")

      Jetzt sollen zusätzlich nur die Titel rausgefiltert werden, deren Anfangsbuchstaben A-M sind, also etwa so:

      Das "zusätzlich" verwirrt hier. Soll das eine Zusätzlcieh Bedingung sein, um die bereits gefundene Menge weiter einzuschränken? Oder soll es eine zusätzliche Bedingung sein, um der gefundenen Menge weitere Elemente zuzuführen?

      if ( (    ($_POST['Category'] == "Business/Finance/Banking")
             or ($_POST['Category'] == "Business/Finance/Credit")
           )
           AND (substr($_POST['Title'],0,1)  >= "A" and substr($_POST['Title'],0,1)  <= "M")
         )
      {
        ## nun darfst Du
      }

      In meinem Traum war es allerdings eine Datenbankfrage.

      Solltest Du die Daten also tatsächlich in einer Datenbank halten, dann solltest Du die Abfrage auch dort durchführen und nicht in PHP.

      Harzliche Grüße aus
      Sankt Andreasberg
      und Guten Rutsch

      Tom

      --
      Nur selber lernen macht schlau

  3. gudn tach!

    Jetzt sollen zusätzlich nur die Titel rausgefiltert werden, deren Anfangsbuchstaben A-M sind, also etwa so:
      if($_POST['Title']  == "A-M")

    sowas kannst du ueber regulaere ausdruecke schaffen:
      if(preg_match('/^[A-M]/', $_POST['Title'])
    bzw. falls auch kleine buchstaben am anfang zulaessig sein sollen:
      if(preg_match('/^[A-M]/i', $_POST['Title'])

    bzgl. der kombination mehrerer bedigungen hat Tom recht:
      if(($_POST['Category'] == 'Business/Finance/Banking' || $_POST['Category'] == 'Business/Finance/Credit') && preg_match('/^[A-M]/', $_POST['Title'])

    siehe php-manual:
    zu regulaeren ausdruecken:
      http://de3.php.net/manual/en/function.preg-match.php
      http://de3.php.net/manual/en/ref.pcre.php
    zu logischen operatoren:
      http://de3.php.net/manual/en/language.operators.php#language.operators.precedence
      http://de3.php.net/manual/en/language.operators.logical.php

    prost
    seth

    1. Hi,

      Jetzt sollen zusätzlich nur die Titel rausgefiltert werden, deren Anfangsbuchstaben A-M sind, also etwa so:
        if($_POST['Title']  == "A-M")

      sowas kannst du ueber regulaere ausdruecke schaffen:

      Halte ich hier wieder mal fuer komplett oversized.

      Zugriff auf das erste Zeichen ueber $_POST['Title']{0}, und dann Abfrage, ob dieses >= 'A' und <= 'M' ist, tut's doch genauso fein.

      (Weitere Pruefungen, ob $_POST['Title'] existiert bzw. Inhalt/ ein "erstes Zeichen" hat, waeren natuerlich noch zu ergaenzen.)

      MfG ChrisB

      1. Hallo,

        Zugriff auf das erste Zeichen ueber $_POST['Title']{0}, und dann Abfrage, ob dieses >= 'A' und <= 'M' ist, tut's doch genauso fein.

        Dann muss man aber in PHP die Funktion ord() verwenden, um den Zeichencode zu erhalten. Zudem: {} als Stringzugriffsoperator ist schon wieder depcreated, inzwischen ist [] wieder "in" (früher war's mal [], dann war's denen zu blöd und sie haben {} genommen und [] für veraltet erklärt, jetzt sind sie wieder zurückgeschwenkt).

        Also: (ord ($_POST['Title'][0]) >= ord ('A') && ord ($_POST['Title'][0]) <= ord ('M')).

        (Bzw. man kann natürlich ord ('M') und ord ('A') vorher bereits durch 77 und 65 ersetzen, um Rechenzeit zu sparen.)

        Und naja, in dem Fall frage ich mich, ob's da nicht doch sinnvoller ist, einen regulären Ausdruck zu verwenden, der vielleicht langsamer ist, bei dem man aber in viel kompakterer Notation sieht, was gemeint ist. Auf das fitzelchen Rechenzeit kommt es hier ja wohl nicht unbedingt an.

        Viele Grüße,
        Christian

        1. Hi,

          Zugriff auf das erste Zeichen ueber $_POST['Title']{0}, und dann Abfrage, ob dieses >= 'A' und <= 'M' ist, tut's doch genauso fein.

          Dann muss man aber in PHP die Funktion ord() verwenden, um den Zeichencode zu erhalten.

          Nein, muss man nicht.
          Gerade mit PHP Version 5.2.5 ausprobiert - und ich meine, dass das in vorherigen Versionen auch funktioniert hat.

          Zudem: {} als Stringzugriffsoperator ist schon wieder depcreated, inzwischen ist [] wieder "in" (früher war's mal [], dann war's denen zu blöd und sie haben {} genommen und [] für veraltet erklärt, jetzt sind sie wieder zurückgeschwenkt).

          Hab noch ueberlegt, ob ich's erwaehnen sollte ...

          Und naja, in dem Fall frage ich mich, ob's da nicht doch sinnvoller ist, einen regulären Ausdruck zu verwenden, der vielleicht langsamer ist, bei dem man aber in viel kompakterer Notation sieht, was gemeint ist.

          Kommt wohl auf den Kenntnisstand des Betrachters an, in wie fern
          preg_match('/[1]/', ...
          auf den ersten Blick verstaendlicher ist.
          Aber da man ja sowieso brav kommentiert, was man macht, kommt's darauf auch nicht so sehr an ...

          Auf das fitzelchen Rechenzeit kommt es hier ja wohl nicht unbedingt an.

          Natuerlich nicht - es geht ums Prinzip :-)

          MfG ChrisB


          1. A-M ↩︎

      2. gudn tach!

        sowas kannst du ueber regulaere ausdruecke schaffen:

        Halte ich hier wieder mal fuer komplett oversized.

        soso, "komplett oversized" halte ich mal wieder fuer komplett uebertrieben. ;-p

        Zugriff auf das erste Zeichen ueber $_POST['Title']{0}, und dann Abfrage, ob dieses >= 'A' und <= 'M' ist, tut's doch genauso fein.

        aha, dir geht's einerseits um speed, andererseits verschwendest du enorm viel zeit damit, eine kopie des ersten elementes explizit anzulegen.
        summa summarum bist du damit bei case-insensitivity [A-Za-z] ungefaehr genausoschnell wie (ok, ca. 10% schneller[1] als) preg_match.
        wenn dagegen einfach $str>='A' aufgerufen und somit keine kopie angelegt wird, ist das deutlich billiger und einsparungen von fast 50% sind moeglich[1].

        es bleibt jedoch so oder so vernachlaessigbar wenig. wesentlich wichtiger ist hier die wart- und lesbarkeit des codes. und dabei ist es dann einfach geschmackssache. ich kann bei sowas regexp besser lesen als mehrere bedingungen hintereinander, einigen anderen geht es gerade andersherum.

        [1] bei mir (466MHz) benoetigte preg_match um die 17,5ns herum. die anderen 15,5 bzw. 9ns. allerdings verringern sich die zeiten der nicht-regexp-dinger, bei case-sensitivity.

        prost
        seth

  4. hi Harald,
    falls du noch eine andere Loesung brauchst:

    <?php

    if(($_POST['Category'] == "Business/Finance/Banking" || $_POST['Category'] == "Business/Finance/Credit") && (in_array(strtolower($_POST['Title'][0]), range('a', 'm'))))
    {
     # ok
    }

    ?>

    mfg k42b3