(PHP 7, PHP 8)
intdiv — Integer division
Returns the integer quotient of the division of num1 by num2.
num1Number to be divided.
num2
Number which divides the num1.
The integer quotient of the division of num1 by num2.
If num2 is 0, a DivisionByZeroError
exception is thrown. If the num1 is PHP_INT_MIN
and the num2 is -1, then an
ArithmeticError exception is thrown.
Example #1 intdiv() example
<?php
var_dump(intdiv(3, 2));
var_dump(intdiv(-3, 2));
var_dump(intdiv(3, -2));
var_dump(intdiv(-3, -2));
var_dump(intdiv(PHP_INT_MAX, PHP_INT_MAX));
var_dump(intdiv(PHP_INT_MIN, PHP_INT_MIN));
?>The above example will output:
int(1) int(-1) int(-1) int(1) int(1) int(1)
Example #2 intdiv() Example With Invalid Divisor
<?php
try {
intdiv(PHP_INT_MIN, -1);
} catch (Error $e) {
echo get_class($e), ': ', $e->getMessage(), PHP_EOL;
}
try {
intdiv(1, 0);
} catch (Error $e) {
echo get_class($e), ': ', $e->getMessage(), PHP_EOL;
}
?>The above example will output:
ArithmeticError: Division of PHP_INT_MIN by -1 is not an integer DivisionByZeroError: Division by zero
This does indeed seem to be equal to intdiv:
<?php
function intdiv_1($a, $b){
return ($a - $a % $b) / $b;
}
?>
However, this isn't:
<?php
function intdiv_2($a, $b){
return floor($a / $b);
}
?>
Consider an example where either of the parameters is negative:
<?php
$param1 = -10;
$param2 = 3;
print_r([
'modulus' => intdiv_1($param1, $param2),
'floor' => intdiv_2($param1, $param2),
]);
/**
* Array
* (
* [modulus] => -3
* [floor] => -4
* )
*/
?>Python style integer division, where the result is always rounded towards minus infinity.
1 // 2 is 0
(-1) // 2 is -1
1 // (-2) is -1
(-1) // (-2) is 0
<?php
function intdiv_py(int $num1, int $num2): int{
if ($num1 < 0 xor $num2 < 0){
$num1 = abs($num1);
$num2 = abs($num2);
$remainder = $num1 % $num2;
return $remainder ? -1 -($num1 - $remainder) / $num2 : -$num1 / $num2;
}
return intdiv($num1, $num2);
}
var_dump(intdiv_py(1, 2)); // 0
var_dump(intdiv_py(-1, 2)); // -1
var_dump(intdiv_py(1, -2)); // -1
var_dump(intdiv_py(-1, -2)); // 0
?>