The author selected Open Sourcing Mental Illness Ltd to receive a donation as part of the Write for DOnations program.
Decisions are an integral part of life. From the mundane decisions about what to wear, to the life-altering decisions of jobs and family. So too in development. For a program to do anything useful, it must be able to respond to some sort of input. When a person clicks the contact button on a website, they expect to be taken to a contact page. If nothing happens, or they are taken to the wrong page, the user may choose to stop using that website or company completely.
Decisions written in code are formed using conditionals: “If x, then y.” Even a button click is a form of condition: “If this button is clicked, go to a certain page.” Conditional statements are part of the logic, decision making, or flow control of a computer program. You can compare a conditional statement to a “Choose Your Own Adventure” book, or a flowchart.
Let’s look at some examples where we would use conditional statements:
When evaluating conditions and assigning code to run based on whether or not those conditions are met, we are writing conditional code.
This tutorial will start with an overview of the comparison operators that will be used to build conditional statements. Next, it will take you through writing conditional statements in PHP, including the if
, else
, and elseif
keywords. This also includes combining conditions using the logical operators of and
or or
. Finally it will also cover some special conditional operators to more precisely describe a situation.
A conditional statement evaluates whether a condition is true or false. This is most often the result of comparing two values. Comparison operators are used, as their name implies, to compare two values. PHP is a loosely typed language, which means, by default, PHP will attempt to change a data type to match an expected result when possible. This is called type juggling, and becomes very important when using comparison operators. As an example, all of the following values would be considered equal even though they are of different types:
false
0
0.0
''
PHP provides several comparison operators to express the desired comparison of both value and type/value combined:
Equal ==
in value, after type juggling, meaning all of the values in the previous code block are equal.
Identical ===
in both type and value, meaning none of the previous values are identical, because they are all of different types.
Not Equal !=
or <>
in value, after type juggling. As the opposite of equal, comparing false != 0
would evaluate as false
because the values match.
Not Identical !==
in both type and value. Comparing false !== 0
would evaluate to true
because although the values evaluate the same, the type is different.
Note: Pay special attention to the exclamation point !
, which functions to negate other conditions.
Besides equal and identical, PHP also provides comparison operators to express how the values relate to one another.
Less than <
is used to show that 5 < 6
is true.
Greater than >
is used to show that 5 > 4
is true.
Less than or equal to <=
is used so show that both 5 <= 5
and 5 <= 6
are true.
Greater than or equal to >=
is used to show that both 5 >= 5
and 5 >= 4
are true.
Now that we know what the comparison operators are, we can look at how to use them to write conditional statements.
Comparison operators are used in combination with the if
, else
, and elseif
keywords to build conditional statements that control the flow of a program.
if
StatementsWhen we wish to execute a specific piece of code only when a condition is met, we use the conditional if
statement, followed by the condition in parentheses ()
, followed by the code to execute within curly braces {}
. The code within the conditional statement will only be executed if the condition evaluates to true
. When the condition is not true
, the code within the conditional statement is ignored and processing continues after the close of the conditional statement. Let’s see how this would look in code:
if ($inventory > 0) {
echo "Add to Cart";
}
The string “Add to Cart” will only be displayed when the variable $inventory
contains a number greater than 0
.
Alternately, if there is only a single expression after the condition, PHP allows us to leave off the curly braces entirely. PHP will execute the first expression after a condition, ending in a semicolon. This includes any whitespace between them. The following evaluates the same way as the previous example:
if ($inventory > 0) echo "Add to Cart";
else
BlockWhen we wish to execute either one specific piece of code or another, we add an else
block to the conditional if
statement. The code within the if
block will only be executed if the statement evaluates to true
, while the code within the else
bock will only be executed when the statement is not true
. Let’s take a look at an example where shoppers are given a discount if they purchase 10 or more items:
if (count($cart) >= 10) {
$discount = $subtotal * .3;
} else {
$discount = 0;
}
When the number of items in the cart is greater than or equal to 10, the statement evaluates to true
, and a discount of 30% is calculated, based on the $subtotal
. When the number of items in the cart is less than 10, the statement evaluates to false
and the else
block is executed, which gives no discount. The comparison could also be written as count($cart) > 9
.
Note: You cannot use the percent sign %
when calculating the percent, because %
is used to calculate the modulo, which is the remainder of $a
divided by $b
: 3 % 8 = 2
. Instead, to calculate a percent, convert the percentage to a decimal by dividing it by 100. So 30%
is 30/100
, or 0.30
, or 0.3
. For more, check out How to Work with Numbers in PHP.
Adding an else
block can sometime make code more confusing. It’s worth considering whether or not we can accomplish the same thing without the else
block. For example, the previous conditional could also be written as follows:
$discount = 0;
if (count($cart) >= 10) {
$discount = $subtotal * .3;
}
We set a default value of 0
for the discount and only change it when the condition is met.
elseif
StatementWhen a second condition is needed, you could add a second conditional statement:
$discount = 0;
if (count($cart) >= 5) {
$discount = $subtotal * .15
}
if (count($cart) >= 10) {
$discount = $subtotal * .3;
}
When adding a second statement in this way, PHP must check each statement, even if the first statement has been matched. If there are 14 items in the cart, the first conditional statement would evaluate to true
, because 14 is greater than or equal to 5, which would set the discount to 15%. After that, the second conditional statement would also evaluate to true
, because 14 is also greater than or equal to 10, once again setting the discount which overrides the value to 30%.
This could also end up returning the wrong discount if the conditions are not in the correct order. When there is the possibility of matching multiple conditions, it’s a good idea to double check that you are evaluating those conditions in the correct order.
The code could be clarified and evaluated more cleanly by using the elseif
block:
$discount = 0;
if (count($cart) >= 10) {
$discount = $subtotal * .3;
} elseif (count($cart) >= 5) {
$discount = $subtotal * .15
}
In this case, the code first checks for a value greater than or qual to 10. If this first statement evaluates to true
, the code within the first conditional block is executed and the other conditional statements are never evaluated. Only when the first condition is not met is the next condition evaluated.
A conditional statement may have any number of elseif
conditions, but only a single else
.
Like nesting dolls, conditional statements may contain other conditional statements “nested” within them. When nesting conditional statements, using consistent indentation helps tremendously with readability. Let’s expand upon our discounts to give more options:
$discount = 0;
if ($country === 'USA') {
if (count($cart) >= 10) {
if ($coupon_discount > .3) {
$discount = $subtotal * $coupon_discount;
} else {
$discount = $subtotal * .3;
}
} elseif (count($cart) >= 5) {
if ($coupon_discount > .15) {
$discount = $subtotal * $coupon_discount;
} else {
$discount = $subtotal * .15
}
}
}
In this example, the discounts are only available for those in the US, so before we check for any discount, we first verify that the $country
variable is set to USA
. The rest of the conditionals will only be reached if that first condition is true
.
Next we check if the number of items in the cart is greater than or equal to 10. If this second condition is true
, then we check if the value of a $coupon_discount
is greater than the normal 30% discount for ordering 10 or more items. If this third condition is true
, then use the $coupon_discount
to calculate the $discount
. Otherwise, this third condition is false
, then use the normal 30% to calculate the discount.
This brings us to the else
block of the second condition. Instead of just else
, the elseif
block is used to verify that the number of items in the cart is greater than or equal to 5 before giving the option for a secondary discount. Once again we check for a value in the $coupon_discount
variable that is greater than the secondary volume discount of 15%. If this fourth condition is true, the $coupon_discount
is used to calculate the $discount
. Otherwise, this fourth condition is false
, then we reach the last discount of 15%.
Nested conditional statements, like the one we just looked at, can be hard to follow, especially if you start adding additional levels. When possible, consider how you might rewrite a conditional statement to remove nesting. The previous condition could also be written as follows:
$discount = 0;
if ($country !== 'USA') {
// no discount for non-us locations
} elseif ($coupon_discount > .3) {
$discount = $subtotal * $coupon_discount;
} elseif (count($cart) >= 10) {
$discount = $subtotal * .3;
} elseif ($coupon_discount > .15) {
$discount = $subtotal * $coupon_discount;
} elseif (count($cart) >= 5) {
$discount = $subtotal * .15;
}
Because PHP allows an empty conditional block, we can check for country first and skip any other conditions. Take careful note of the negative expression !==
meaning that the country does not match the value USA
. Although you can leave a block completely empty, adding a comment explains the intention to leave that block empty.
For the elseif
blocks, we start with the most restrictive and work our way down. Someone in the USA with a coupon worth 20% (.2) would have the first 3 blocks evaluate to false
. Then they would reach the third elseif
, which would evaluate to true
because .2 is greater than .15. The discount would be calculated and the final condition block would be passed over.
The most common syntax for conditional statements is using curly braces, as the previous examples showed. PHP does provide an alternative syntax which can make things easier to read when there are long blocks of code between each conditional, or when a loop, which also uses curly braces, is used within a conditional. This alternative syntax is written using colons after the conditional statement and finalizing the conditional block with an endif;
statement. The discount example could be written with this alternative syntax as follows:
$discount = 0;
if ($country !== 'USA'):
// no discount for non-us locations
elseif ($coupon_discount > .3):
$discount = $subtotal * $coupon_discount;
elseif (count($cart) >= 10):
$discount = $subtotal * .3;
elseif ($coupon_discount > .15):
$discount = $subtotal * $coupon_discount;
elseif (count($cart) >= 5):
$discount = $subtotal * .15;
else:
$discount = $subtotal * .05;
endif;
While nesting a loop within these conditional blocks is acceptable, nesting curly brace conditionals within these conditional blocks may lead to unexpected results. It’s best to stick with either curly braces or colons.
Note: Because of the way PHP handles whitespace, it will accept spaces between else
and if
when using curly braces: } else if (...){
. However, PHP will fail with a parse error if you use a space when using a colon to define your statement: elseif (...):
. In practice, it’s a good idea to avoid spaces and always write this as the single elseif
.
Using a single comparison operator in each conditional statement is not the only way to use comparison operators. Not only can we combine conditions, we can also use comparison operators outside of a conditional.
When there are multiple conditions that both need to be true, or multiple conditions which would have the same affect, the conditional statements may be combined into a single block using Logical Operators.
And and
says that both conditions must be true
.
Or or
says that either condition is true
or they could both be true
.
Xor xor
says that only one of the conditions is true
.
Not !
is used to negate a condition, which changes it from evaluating true
to evaluating false
.
And &&
says that both conditions must be true
.
Or ||
says that either condition is true
or they could both be true
.
The reason for the two different variations of and and or operators is that they operate at different precedences. The precedence of an operator specifies how “tightly” it binds two expressions together, or in what order the operations are evaluated. (See Documentation for Operator Precedence.) Either way is perfectly acceptable and works the same in most situations. Operators in PHP are case-insensitive, meaning the operator could also be written as OR
(or even Or
or oR
, neither of which would I recommend). To minimize confusion, the most important thing is to be consistent in whichever you choose. I’ll be using and
and or
in the examples because they are more natural to read.
Using this in the discount example: To check that both the $country
variable is set to USA
and that the items in the cart are greater than or equal to 10, those conditions can be combined using the and
operator:
$discount = 0;
if ($country === 'USA' and count($cart) >= 10) {
$discount = $subtotal * .3;
}
The example has two conditions $country === 'USA'
and count($cart) >= 10
. If both of these conditions evaluate to true
, the code within that block will be executed. This example used the and
operator, but it could also have used AND
or even the &&
operator with the exact same results.
We can also combine conditions that would have to same result. If having 10 or more items in the cart produces a discount of 30%, or having a subtotal of $100 or more would also produce a discount of 30%, these conditionals could be combined:
$discount = 0;
if (count($cart) >= 10 or $subtotal >= 100) {
$discount = $subtotal * .3;
}
More than two conditions can also be combined; however, be extra cautious in their use. Let’s try to combine the country evaluation along with the cart count and subtotal comparison:
# BAD
$discount = 0;
if ($country === 'USA' and count($cart) >= 10 or $subtotal >= 100) {
$discount = $subtotal * .3;
}
This example doesn’t actually work the way it was intended because the country is evaluated with the count of the cart first, then that result is evaluated against the subtotal comparison using or
. This means that no matter what the country or count values, if $subtotal
is greater than or equal to 100
, the full conditional statement will evaluate to true
.
Parentheses can be used to make sure that the conditions are evaluated in the intended order:
$discount = 0;
if ($country === 'USA' and (count($cart) >= 10 or $subtotal >= 100)) {
$discount = $subtotal * .3;
}
Now the cart count is evaluated with the subtotal comparison before the country is evaluated with that result. This provides the desired outcome of requiring $country
to have the value of USA
and then either the count of the cart or the comparison of the subtotal (or both) must also evaluate to true
.
Sometime an entire conditional block is not required to compare two values. PHP provides a few shorthand comparison operators to more precisely describe a situation.
When there should be one result if an expression is true and another result if that same expression is false, a ternary operator can be used. The expression (expr1) ? (expr2) : (expr3)
evaluates to expr2
if expr1
evaluates to true
, and expr3
if expr1
evaluates to false
. Let’s say that the username of a visitor should be shown if
they are logged in, while the word “Guest” should be displayed if not. The function isset
will help us to evaluate this condition because it will check that a variable has actually been defined. If the variable is defined, isset
returns true
; if not, isset
returns false
:
echo (isset($username)) ? 'Guest' : $username;
This is identical to this if/else
statement:
if (isset($username)) {
echo 'Guest';
} else {
echo $username;
}
It is possible to leave out the middle part of the ternary operator. The expression expr1 ?: expr3
returns expr1
if expr1
evaluates to true, and expr3
otherwise. To show either the username or the word “Guest”, the ternary operator would look something like:
echo $username ?: 'Guest';
This works if $username
is set to an empty string, but if $username
is not set at all, we get an error. The isset
function cannot be used in this situation, because the output of isset($username)
would either be true
or false
, instead of the value of $username
. This brings us to our next operator.
The null coalescing operator (??
) has been added as “syntactic sugar” (sweet to have but not required) for the common case of needing to use a ternary in conjunction with isset()
. It returns its first operand if it exists and is not null; otherwise it returns its second operand. To show either the username or the word “Guest”, the null coalescing operator is used:
echo $username ?? 'Guest';
The spaceship operator (<=>
) is used for comparing two expressions: $a <=> $b
. It returns -1, 0, or 1 when $a
is respectively less than (<
), equal to (=
), or greater than (>
) $b
:
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
Warning: Although the spaceship operator is not used often, it comes in very handy when writing a “user defined sort” (usort
) function. The following example includes additional concepts you may not be familiar with yet. Don’t worry if you don’t follow all of the code right now. I’ll explain what’s going on in the example, and we’ll cover these concepts in more depth in a later tutorial.
Let’s create an array of new products. Each product in the array will, in turn, be its own nested array of product attributes:
$products = [
['name'=>'Flippers', 'price'=>7.99],
['name'=>'Wet Suit', 'price'=>18.99),
['name'=>'Snorkel', 'price'=>2.99),
['name'=>'Mask', 'price'=>6.99),
];
Now let’s say we want to sort this $products
array by the price of each item, in descending order. We can do this by using the usort
function, into which we then pass an anonymous function which handles the sorting logic. Let’s look at the code:
usort($products, function($item1, $item2) {
return $item2["price"] <=> $item1["price"];
});
The usort
function is taking two arguments (the values passed to a function). The first argument is the $products
array. The second is an anonymous function which tells the usort
function what to do with each item in the array. If the price of $item2
is less than the price of $item1
, the operator will return -1
, which will move $item2
before $item1
. If the prices are the same, the operator will return 0
, which will keep the items in the same order. Finally, if the price of $item2
is greater than the price of $item1
, the operator will return 1
, which will put $item2
after $item1
, which again is the same order in which they started.
To sort by price in ascending order instead, we flip the position of $item1
and $item2
, which changes the order of the comparison:
usort($products, function($item1, $item2) {
return $item1["price"] <=> $item2["price"];
});
Conditional statements provide us with flow control to determine the output choices of our programs. They are one of the foundational building blocks of programming, and can be found in virtually all programming languages.
This tutorial covered both comparison operators for comparing values and logical operators for combining conditions. It demonstrated the use of the if
, else
, and elseif
keywords while looking at nested statements and combining conditions. Finally it introduced the use of additional comparison operators, including the ternary operator, null coalescing operator, and the spaceship operator. To continue practicing conditional statements:
<
, >
, ==
, ===
and
or or
if
statement using a ternary, null coalescing, or spaceship operatorFor more information on how to code in PHP, check out other tutorials in the How To Code in PHP series.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
PHP is a popular server scripting language known for creating dynamic and interactive web pages.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Sign up for Infrastructure as a Newsletter.
Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.
Hi Alena and Brian,
I was wondering, do we need to replace the word “either” with “both” in the paragraph that is below the code example that explain the use of the logical operator “and”?
Code Example
$discount = 0; if ($country === ‘USA’ and count($cart) >= 10) { $discount = $subtotal * .3; }
The screenshots below might help understand what I’m referring to.
https://drive.google.com/file/d/1_w_wq75AvyZtHsuInTHMJ8fTieNQR7Qc/view?usp=sharing
https://drive.google.com/file/d/1yRNfJwX_0F14nrTJU6ZkIbZk7Zm6bwZt/view?usp=sharing