International PHP Conference 2019 - Spring Edition

## 算术运算符

-\$a 取反 \$a 的负值。
\$a + \$b 加法 \$a\$b 的和。
\$a - \$b 减法 \$a\$b 的差。
\$a * \$b 乘法 \$a\$b 的积。
\$a / \$b 除法 \$a 除以 \$b 的商。
\$a % \$b 取模 \$a 除以 \$b 的余数。
\$a ** \$b Exponentiation Result of raising \$a to the \$b'th power. Introduced in PHP 5.6.

``` <?phpecho (5 % 3)."\n";           // prints 2echo (5 % -3)."\n";          // prints 2echo (-5 % 3)."\n";          // prints -2echo (-5 % -3)."\n";         // prints -2?> ```

### User Contributed Notes 13 notes

55
Jonathon Reinhart
12 years ago
``` A very simple yet maybe not obvious use of the modulus (%) operator is to check if an integer is odd or even.<?php  if ((\$a % 2) == 1)  { echo "\$a is odd." ;}  if ((\$a % 2) == 0)  { echo "\$a is even." ;}?>This is nice when you want to make alternating-color rows on a table, or divs.<?php  for (\$i = 1; \$i <= 10; \$i++) {    if((\$i % 2) == 1)  //odd      {echo "<div class=\"dark\">\$i</div>";}    else   //even      {echo "<div class=\"light\">\$i</div>";}   }?> ```
pr dot dot dot dot k at g dot dot dot com
1 year ago
``` The modulus operator is very poorly suited for such a simple operation as determining if an int is even or odd. On most common systems, modulus performs a division, which is a very slow operation.A much better way to find if a number is even or odd is to use the bitwise & operator.e.g.\$is_odd = \$x & 1; //using and\$is_odd = \$x % 2; //using modulus ```
info at sima-pc dot com
14 years ago
``` Note that operator % (modulus) works just with integers (between -214748348 and 2147483647) while fmod() works with short and large numbers.Modulus with non integer numbers will give unpredictable results. ```
-6
arjini at gmail dot com
14 years ago
``` When dealing purely with HTML, especially tables, or other things in "grids"  the modulous operator is really useful for splitting up the data with a seperator.This snippet reads any gif files from the directory the script is in, prints them out and puts in a break every 5th image.<?php    \$d = dir('./');    \$i = 0;    while(false !== (\$e = \$d->read())){        if(strpos(\$e,'.gif')){            ++\$i;            echo '<img src="'.\$e.'"/>'.chr(10);            if(!(\$i%5))                echo '<br/>';        }    }?>For tables just put </tr><tr> in place of the break. ```
-5
philippe
11 months ago
``` To get a positiv resultfunction modulo(int \$a, int \$b):?int {  if (\$b == 0) {    throw new Exception('modulo : second operand must not be zero');  }  \$b = abs(\$b);  // test \$b == 1 for performance when \$a < 0  return (\$b == 1) ? 0 : ((\$a < 0) ? modulo(\$a + \$b, \$b) : \$a % \$b);} ```
-11
TheWanderer
10 years ago
``` It is worth noticing that when working with large numbers, most noticably using the modulo operator, the results depend on your CPU architecture. Therefore, running a decent 64-bit machine will be to your advantage in case you have to perform complex mathematical operations. Here is some example code - you can compare its output on x86 and x86_64 machines:<?php/* tested under PHP 5.2.6-1 with Suhosin-Patch 0.9.6.2 (cli) on both i386 and amd64, Debian lenny/sid */\$a = 2863311530;\$b = 256;\$c = \$a % \$b;echo "\$c <br />\n";echo (2863311530 % 256)." <br />\n"; /* directly with no variables, just to be sure */?>The code is expected to produce '170' if working correctly (try it in spreadsheet software). ```
-11
Dominik Buechler
3 years ago
``` In addition to Jonathan's comment, there is a way simpler way to determine if an integer is even or not:<? \$odd = \$i % 2; ?> or<? \$even = !(\$i % 2); ?>This works because a modulo division by 2 will always return either 0 or the rest 1. Since those are valid boolean values you can just invert them by adding a prefixed ! if wanted. ```
-19
Andrew
5 years ago
``` The % operator doesn't behave as many people with a maths background would expect, when dealing with negative numbers. For example, -1 mod 8 = 7, but in PHP, -1 % 8 = -1.The following function has the expected behaviour:function mod(\$a, \$n) {    return (\$a % \$n) + (\$a < 0 ? \$n : 0);}mod(-1, 8) returns 7 as expected. ```
-16
lmc at trendicy dot com
4 years ago
``` If you are running a php version older than 5.6, you can calculate \$a ** \$b by using exp(\$b*log(\$a)) ```
-9
peter at icb dot at
1 year ago
``` If you need the mathematical modulo (always positive) from negative numbers, use this small function:<?phpfunction modulo(\$a , \$b) { return (\$a + \$b) % \$b; }// examples:echo modulo(15, 12);  // 3echo modulo(-9, 12);  // 3?> ```
-27
calmarius at atw dot hu
10 years ago
``` Be careful when using % with large numbers.The code:<?php    echo 3333333333 % 3?>puts out -1 instead of zero!(Due to the overflow) ```
-31
glenn at benge dot co dot nz
14 years ago
``` a real simple method to reset an integer to a the next lowest multiple of a divisor\$startSeq = \$startSeq - (\$startSeq % \$entriesPerPage);if \$startSeq was already a multiple, then " \$startSeq % \$entriesPerPage " will return 0 and \$startSeq will not change. ```
-46
php at richardneill dot org
7 years ago
``` For larger numbers (above PHP_INT_MAX), use fmod() rather than %. The other operators (+-*/) work correctly with floats and integer overflow, but % uses integer wrap. Eg. <?php var_dump(0xffffffff % 2); //Prints  int(-1)   which is WRONG var_dump(intval(fmod(0xffffffff,2))); //Prints int(1)   which is the right answer ?> (The reason this matters is that PHP's float is actually a double, and can accurately represent integers up to 52-bits, even on 32-bit systems) ```