nderjung
nderjung

Reputation: 1617

simple if statements (not short hand)

So today, as everyday, I was programming. Going along my usual business, typing away, listening to Daft Punk and various other groovy tunes. Then out of the blue, I had to write something along the lines of:

$x = 'a'; // For instance

if ($x == 'a' || $x == 'b') {
    // ...
}

Simple enough, not too shabby I say. But wait! I thought to myself "there must be an easier way to do that - I'm repeating myself". So I set about attempting to solve this with the following code:

if ($x == ('a' || 'b')) { 
    // ...
}

However, that doesn't work. At all. It's always true. If $x is equal to a, b, c or cake. So I sulked, cried a little bit and have decided to ask Stackoverflow if any of you guys know why.

Thanks!

Upvotes: 4

Views: 176

Answers (7)

vishal
vishal

Reputation: 705

As you know || is a logical operator and always return true or false(in another word 1 or 0). So, code ('a' || 'b') always return true(1). In this above case $x contains value so due to automatic type conversation $x also set to true(1) so its if(1 == 1) and return always true.

try with bellow code

$x = false;
if ($x == ('a' || 'b')) { echo 'true'; } else{ echo 'false';}

Always return false.

Upvotes: 1

Viktor
Viktor

Reputation: 507

I would do:

$valid = array('a', 'b');

if (in_array($x, $valid)) {
    ...
}

Simple enough!

...but, in retrospect, maybe you didn't want another way to do it?

Upvotes: 1

message
message

Reputation: 4603

See how php converts strings to boolean

php > var_dump((bool) "a");
bool(true)
php > var_dump((bool) "b");
bool(true)
php > var_dump((bool) "cake");
bool(true)

So basically you asking php if($x == true)

Upvotes: 0

Karoly Horvath
Karoly Horvath

Reputation: 96266

|| is the logical or, it evaluates the left side as boolean ('a', which is in boolean context true) and if that's true returns true, if not, it does the same thing for the right hand side.

var_dump('a' || 'b');
bool(true)

Now, this value is compared against a character, which, based on the crazy rules of PHP (loose comparison chart), will also be true:

var_dump('a' == true);
bool(true)

Upvotes: 2

complex857
complex857

Reputation: 20753

It didn't worked because

$a = 'a' || 'b'; // true, since 'a' and 'b' considered truthy

In this case, your string literals will be converted to booleans.

And if your $x in the if is not an empty string or other string considered falsy they will be equal.

However you can write your if like this:

if (in_array($x, array('a', 'b', 'cake'))

If you feel that it makes your intent more clear.

Upvotes: 1

Matt
Matt

Reputation: 7040

You're asking PHP to evaluate if $x is equal to the value of ('a' OR 'b'), which will ALWAYS return true since both 'a' and 'b' have nonzero values.

You must use the comparison operator individually in this case, or use nickb's suggestion from the comments.

Upvotes: 1

Related Questions