Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg

PHP : Language Reference : Operators : Incrementing/Decrementing Operators

Incrementing/Decrementing Operators

PHP supports C-style pre- and post-increment and decrement operators.


The increment/decrement operators do not affect boolean values. Decrementing NULL values has no effect too, but incrementing them results in 1.

Table 6.6. Increment/decrement Operators

Example Name Effect
++$a Pre-increment Increments $a by one, then returns $a.
$a++ Post-increment Returns $a, then increments $a by one.
--$a Pre-decrement Decrements $a by one, then returns $a.
$a-- Post-decrement Returns $a, then decrements $a by one.

Here's a simple example script:

echo "<h3>Postincrement</h3>";
$a = 5;
"Should be 5: " . $a++ . "<br />\n";
"Should be 6: " . $a . "<br />\n";

$a = 5;
"Should be 6: " . ++$a . "<br />\n";
"Should be 6: " . $a . "<br />\n";

$a = 5;
"Should be 5: " . $a-- . "<br />\n";
"Should be 4: " . $a . "<br />\n";

$a = 5;
"Should be 4: " . --$a . "<br />\n";
"Should be 4: " . $a . "<br />\n";

PHP follows Perl's convention when dealing with arithmetic operations on character variables and not C's. For example, in Perl 'Z'+1 turns into 'AA', while in C 'Z'+1 turns into '[' ( ord('Z') == 90, ord('[') == 91 ). Note that character variables can be incremented but not decremented and even so only plain ASCII characters (a-z and A-Z) are supported.

Example 6.5. Arithmetic Operations on Character Variables

= 'W';
for (
$n=0; $n<6; $n++) {
   echo ++
$i . "\n";

The above example will output:


Incrementing or decrementing booleans has no effect.

Code Examples / Notes » language.operators.increment


to thus trying to increment a string and are blocked by the exponential typecast explained in the message below, here is a small function :
function increment($var) {
$var2 = '_'.$var;
return substr(++$var2,1);


The exact moment when post-increment and post-decrement happen is _just immediately after the variable is evaluated_ (not "after the line is processed" or something like that)
Example 1:
$i = 2;
echo $i++ + $i;
Result: 5. The first i is evaluated as 2, gets incremented to 3. i is then evaluated as 3 for the second occurance.
Example 2:
$i = 2;
echo $i + $i++;
Result: 4. The first i is 2. Second i is 2 too, gets incremented afterwards.

michal dot kocarek

Speed tip:
Do not use post-incrementation/post-decrementation ($i++, $i--) where you do not work with the result of this expression.
(For novices: Yes, every expression returns an result, also $a = '5' returns result, same as $a && $b. And this consumes more time and resources.)
When writing loops, replace the post-incrementation with pre-incrementation, it is around 3times faster than post-incrementation.
Why? In post-incrementation, PHP needs to copy variable value somewhere, then it increments the value, then returns the value which was stored before the incrementation was done. No matter if you don't expect the return value, PHP is scripting language, not compiled one, so it doesn't optimize use of return values.
// Good practice for loop:
$array_count = count($array); // Store temporarily instead of calling everytime in loop
for ($i = 0; $i < $max_count; ++$i) { // Use pre-incrementation here, it is faster
  // do something here

are pedersen

Something to think about:
$a  +=  $a++   +   ++$a;
echo $a;
will give you 7.
Why is this?
1. ++$a is first incremented. Now $a is 2.
$a += $a++  +  2
$a is 2
2. $a++ is added to 2 then $a is incremented
$a += 2 + 2
$a is 3
3. now the value of 2 + 2 is added to $a ($a is 3)
$a = $a + 2 + 2
Answer: 3 + 2 + 2 = 7


Other samples :
$l="A";      $l++; -> $l="B"
$l="A0";     $l++; -> $l="A1"
$l="A9";     $l++; -> $l="B0"
$l="Z99";    $l++; -> $l="AA00"
$l="5Z9";    $l++; -> $l="6A0"
$l="9Z9";    $l++; -> $l="10A0"
$l="9z9";    $l++; -> $l="10a0"
$l="J85410"; $l++; -> $l="J85411"
$l="J99999"; $l++; -> $l="K00000"
$l="K00000"; $l++; -> $l="K00001"


Note that the ++ and -- don't convert a boolean to an int. The following code will loop forever.
function a($start_index) {
for($i = $start_index; $i < 10; $i++) echo "\$i = $i\n";
This behavior is, of course, very different from that in C. Had me pulling out my hair for a while.

31-mar-2004 10:19

Note that incrementing strings can give unpredictable results due to type changes.  For example:
$i = '9C6';
for($n=0; $n<10; $n++)
 echo ++$i . "\n";
Gives you:
The 'D' (and also 'E') characters are interpreted here as exponents of 10 (i.e., scientific notation) formatted numbers.  Using '9D6' will give 9000001, 9000002, etc.
You might want to use all alphabetical or all numerical, but not mix the two otherwise you may not get what you expect..


JMcCarthy AT CitiStreet DOT com:
As for your March 31 post, at least in PHP version 4.3 this no longer holds for 'D'. Your point is still valid for 'e' or 'E' and worth noting.
Your comment from May 12 is simply not true, although it might be a bug in your specific version of PHP but that would seem very strange.
   $Align = array('a', 'b', 'c');
   $i = 0;
   echo $Align[$i++]; // Prints 'a', as expected
It might be interesting to know that pre-/postincrement assumes a value of 0 for undefined variables, but pre-/postdecrement does not:
   echo var_dump(++$foo); // int(1)
   echo var_dump(--$bar); // NULL!


Interesting performance note:
$i++ seems to be slightly slower than ++$i, when used on a line by itself the 2 have the same purpose.  It's not much, but over 100,000 incements the pre-increment is about .004 seconds faster on average.

rowan dot collins

As the manual says, decrementing NULL in this way yields NULL, although incrementing it yields 1, as you might expect. Can't quite see why this makes sense, but if you need to work around it, you can use '-= 1' instead:
$i = null;
var_dump($i); // NULL
var_dump($i); // NULL
var_dump($i); // int(-1)
Note that -= returns the value assigned, so treat it like '--$i', not '$i--' if you're testing the value.


A more detailed explanation of the string incremant is:
First of all it is checked wether the string is a standart representaion of a number wich is true if it equals the regex /^ *[+-]?[0-9]*(\.[0-9]|[0-9]\.)[0-9]*([eE]?[+-]?[0-9]+)?$/
but not the regex /\+\./ (no idea why).
if it does, the type is changed to integer (if it equals /^ *[+-]?[0-9]+$/) or to float and then incremented by one.
An empty string becomes the string "1".
Otherwise if the last character is one of [0-8], [a-y] or [A-Y] it is incremented. If it is Z it puts it back to A, is z to a, if 9 to 0 and trys to do the same with the previouse character.
If a character is reatched that is not in [0-9a-zA-Z], nothing is done anymore (that's why " Z" will increment to " A").
If the begining is reached a new caracter is prepended. "1" "a" or "A" depending on wether the first character was "9", "z" or "Z".
If the last character was not [0-9a-zA-Z] the string isn't chaged.
hope this helps someone

Change Language

Follow Navioo On Twitter
Operator Precedence
Arithmetic Operators
Assignment Operators
Bitwise Operators
Comparison Operators
Error Control Operators
Execution Operators
Incrementing/Decrementing Operators
Logical Operators
String Operators
Array Operators
Type Operators
eXTReMe Tracker