PHP provides 3 basic types of loops:

  • For Loop
  • While Loop
  • Foreach Loop

For Loop

for loops are the most complex loops in PHP. They behave like their C counterparts. The syntax of a for loop is:

[php]
for (expr1; expr2; expr3)
statement
[/php]

The first expression (expr1) is evaluated (executed) once unconditionally at the beginning of the loop.

In the beginning of each iteration, expr2 is evaluated. If it evaluates to TRUE, the loop continues and the nested statement(s) are executed. If it evaluates to FALSE, the execution of the loop ends.

At the end of each iteration, expr3 is evaluated (executed).

Each of the expressions can be empty or contain multiple expressions separated by commas. In expr2, all expressions separated by a comma are evaluated but the result is taken from the last part. expr2 being empty means the loop should be run indefinitely (PHP implicitly considers it as TRUE, like C). This may not be as useless as you might think, since often you’d want to end the loop using a conditional break statement instead of using the for truth expression.

Consider the following examples. All of them display the numbers 1 through 10:

[php]
<?php
/* example 1 */
for ($i = 1; $i &lt;= 10; $i++) {
echo $i;
}

/* example 2 */

for ($i = 1; ; $i++) {
if ($i &gt; 10) {
break;
}
echo $i;
}

/* example 3 */

$i = 1;
for (; ; ) {
if ($i &gt; 10) {
break;
}
echo $i;
$i++;
}

/* example 4 */

for ($i = 1, $j = 0; $i &lt;= 10; $j += $i, print $i, $i++);
?>
[/php]

Of course, the first example appears to be the nicest one (or perhaps the fourth), but you may find that being able to use empty expressions in for loops comes in handy in many occasions.

PHP also supports the alternate “colon syntax” for for loops.

[php]
for (expr1; expr2; expr3):
statement

endfor;
[/php]

It’s a common thing to many users to iterate through arrays like in the example below.

[php]
<?php
/*
* This is an array with some data we want to modify
* when running through the for loop.
*/
$people = array(
array(‘name’ =&gt; ‘Kalle’, ‘salt’ =&gt; 856412),
array(‘name’ =&gt; ‘Pierre’, ‘salt’ =&gt; 215863)
);

for($i = 0; $i &lt; count($people); ++$i) {
$people[$i][‘salt’] = mt_rand(000000, 999999);
}
?>[/php]

The above code can be slow, because the array size is fetched on every iteration. Since the size never changes, the loop be easily optimized by using an intermediate variable to store the size instead of repeatedly calling count():

[php]
<?php
$people = array(
array(‘name’ =&gt; ‘Kalle’, ‘salt’ =&gt; 856412),
array(‘name’ =&gt; ‘Pierre’, ‘salt’ =&gt; 215863)
);

for($i = 0, $size = count($people); $i &lt; $size; ++$i) {
$people[$i][‘salt’] = mt_rand(000000, 999999);
}
?>
[/php]

While Loop

while loops are the simplest type of loop in PHP. They behave just like their C counterparts. The basic form of awhile statement is:

[php]
while (expr)
statement
[/php]

The meaning of a while statement is simple. It tells PHP to execute the nested statement(s) repeatedly, as long as the while expression evaluates to TRUE. The value of the expression is checked each time at the beginning of the loop, so even if this value changes during the execution of the nested statement(s), execution will not stop until the end of the iteration (each time PHP runs the statements in the loop is one iteration). Sometimes, if the whileexpression evaluates to FALSE from the very beginning, the nested statement(s) won’t even be run once.

Like with the if statement, you can group multiple statements within the same while loop by surrounding a group of statements with curly braces, or by using the alternate syntax:

[php]
while (expr):
statement

endwhile;
[/php]

The following examples are identical, and both print the numbers 1 through 10:

[php]
<?php
/* example 1 */

$i = 1;
while ($i &lt;= 10) {
echo $i++;  /* the printed value would be
$i before the increment
(post-increment) */
}

/* example 2 */

$i = 1;
while ($i &lt;= 10):
echo $i;
$i++;
endwhile;
?>
[/php]

Foreach Loop

The foreach construct provides an easy way to iterate over arrays. foreach works only on arrays and objects, and will issue an error when you try to use it on a variable with a different data type or an uninitialized variable. There are two syntaxes:

[php]
foreach (array_expression as $value)
statement
foreach (array_expression as $key =&gt; $value)
statement
[/php]

The first form loops over the array given by array_expression. On each iteration, the value of the current element is assigned to $value and the internal array pointer is advanced by one (so on the next iteration, you’ll be looking at the next element).

The second form will additionally assign the current element’s key to the $key variable on each iteration.

It is possible to customize object iteration.

Note:

In PHP 5, when foreach first starts executing, the internal array pointer is automatically reset to the first element of the array. This means that you do not need to call reset() before a foreach loop.

As foreach relies on the internal array pointer in PHP 5, changing it within the loop may lead to unexpected behavior.

In PHP 7, foreach does not use the internal array pointer.

In order to be able to directly modify array elements within the loop precede $value with &. In that case the value will be assigned by reference.

[php]
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &amp;$value) {
$value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
unset($value); // break the reference with the last element
?>
[/php]

Referencing $value is only possible if the iterated array can be referenced (i.e. if it is a variable). The following code won’t work:

[php]
<?php
foreach (array(1, 2, 3, 4) as &amp;$value) {
$value = $value * 2;
}
?>[/php]

Warning

Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by unset().

Note:

foreach does not support the ability to suppress error messages using ‘@’.

You may have noticed that the following are functionally identical:

[php]
<?php
$arr = array("one", "two", "three");
reset($arr);
while (list(, $value) = each($arr)) {
echo "Value: $value&lt;br /&gt;\n";
}

foreach ($arr as $value) {
echo "Value: $value&lt;br /&gt;\n";
}
?>
[/php]

The following are also functionally identical:

[php]
<?php
$arr = array("one", "two", "three");
reset($arr);
while (list($key, $value) = each($arr)) {
echo "Key: $key; Value: $value&lt;br /&gt;\n";
}

foreach ($arr as $key =&gt; $value) {
echo "Key: $key; Value: $value&lt;br /&gt;\n";
}
?>
[/php]

Some more examples to demonstrate usage:

[php]
<?php
/* foreach example 1: value only */

$a = array(1, 2, 3, 17);

foreach ($a as $v) {
echo "Current value of \$a: $v.\n";
}

/* foreach example 2: value (with its manual access notation printed for illustration) */

$a = array(1, 2, 3, 17);

$i = 0; /* for illustrative purposes only */

foreach ($a as $v) {
echo "\$a[$i] =&gt; $v.\n";
$i++;
}

/* foreach example 3: key and value */

$a = array(
"one" => 1,
"two" => 2,
"three" => 3,
"seventeen" => 17
);

foreach ($a as $k =&gt; $v) {
echo "\$a[$k] =&gt; $v.\n";
}

/* foreach example 4: multi-dimensional arrays */
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";

foreach ($a as $v1) {
foreach ($v1 as $v2) {
echo "$v2\n";
}
}

/* foreach example 5: dynamic arrays */

foreach (array(1, 2, 3, 4, 5) as $v) {
echo "$v\n";
}
?>
[/php]

Unpacking nested arrays with list()

(PHP 5 >= 5.5.0, PHP 7)

PHP 5.5 added the ability to iterate over an array of arrays and unpack the nested array into loop variables by providing a list() as the value.

For example:

[php]
<?php
$array = [
[1, 2],
[3, 4],
];

foreach ($array as list($a, $b)) {
// $a contains the first element of the nested array,
// and $b contains the second element.
echo "A: $a; B: $b\n";
}
?>
[/php]

The above example will output:

A: 1; B: 2
A: 3; B: 4

You can provide fewer elements in the list() than there are in the nested array, in which case the leftover array values will be ignored:

[php]<?php
$array = [
[1, 2],
[3, 4],
];

foreach ($array as list($a)) {
// Note that there is no $b here.
echo "$a\n";
}
?>
[/php]

The above example will output:

1
3

A notice will be generated if there aren’t enough array elements to fill the list():

[php]
<?php
$array = [
[1, 2],
[3, 4],
];

foreach ($array as list($a, $b, $c)) {
echo "A: $a; B: $b; C: $c\n";
}
?>
[/php]

The above example will output:

Notice: Undefined offset: 2 in example.php on line 7
A: 1; B: 2; C: 

Notice: Undefined offset: 2 in example.php on line 7
A: 3; B: 4; C:
Understanding Types of Loops in PHP

Leave a Reply

Your email address will not be published. Required fields are marked *

%d bloggers like this: