mehrfache if abfrage
Harald
- php
0 Rick0 Tom0 Tom
0 seth_not@home0 ChrisB0 Christian Seiler0 ChrisB
0 seth
0 k42b3
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
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
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
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
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
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
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
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
A-M ↩︎
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
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