如何在PHP中使用Modulo运算符

PHP总共有八个算术运算符。 最常见的是加法( + ),减法( - ),乘法( * )和除法( / )。 模数( % )是一个不太为人所知但仍然非常重要的运算符。 在本教程中,我们将重点介绍模运算符。 我们将讨论它的作用及其一些实际用途。

模运算符做什么?

如果您有两个变量$a$b ,则计算$a % $b通常发音为“ a模b”或“ a mod b”)将在将$a除以$b之后得到余数。 模数是整数运算符,因此在计算余数之前,会将两个操作数都转换为整数。 因此,基本上取模进行整数除法,然后归还除数中剩下的任何东西。

模运算返回的值的符号由除数的符号确定。 在除法中,将两个负数相除后的结果将为正数。 但是,模运算符不是这种情况。 除数的符号对最终值没有影响。

以下是几个示例:

<?php

echo 1089 % 37;
// Output: 16

echo 1089 % -37;
// Output: 16

echo -1089 % 37;
// Output: -16

echo -1089 % -37;
// Output: -16

echo -55.4 % -4.2;
// Output: -3

echo -55.9 % -4.8;
// Output: -3

echo -55 % -4;
// Output: -3

?>

浮点模数

如果要在两个浮点数彼此相除时计算余数,则必须使用fmod($dividend, $divisor)函数。 它返回除法后的浮点余数。 余数的值与除数的符号相同,并且其大小小于除数。 这三个数字之间的关系如下:

$dividend = i*$divisor + $remainder

在此,值i将始终为整数。

您应该记住,由于分数的二进制或十进制表示形式的限制,浮点算术并不总是准确的。 例如,不能以十进制形式精确表示1/3。 您可以继续编写0.33333 ....,但是在某些时候您必须停止。 在十进制表示形式中,每增加3个字符,您将更接近原始值,但该值仍将不完全是1/3。

这种不准确性会导致fmod()函数出现问题:结果并不完全可靠。

以下是fmod()函数的一些示例:

<?php

echo fmod(18.8, 2);
// Output: 0.8

echo fmod(18.8, 0.2);
// Output: 0.2

?>

第二个值不准确,因为0.2完美地分成了18.8。 这只是计算机使用的浮点格式的计算的一个缺点。

模运算符的用途

在本教程中,我们将限制自己使用整数模,因为它更常见并且有很多应用。

检查数字是否为其他数字的倍数

如果第一个数字可以完全除以第二个数字,则模运算符的结果为零。 这可以用来检查一个数字是否是给定数字对中另一个数字的倍数。 模运算符的此属性的最常见用法是检查数字是偶数还是奇数。 这是一个例子:

<?php

$colors = ['violet', 'indigo', 'blue', 'green', 'yellow', 'orange', 'red'];
$color_count = count($colors);

if($color_count % 2 == 0) {
    echo 'We have created some color pairs for you.';
} else {
    echo 'Please specify one more or one less color to make pairing possible.';
}

?>

在上面的示例中,您可能会从用户那里获得颜色列表,并要求他们仅提供偶数个颜色。

下面的示例使用类似的推理来创建每个有5名学生的小组。 在现实生活中,您将不得不使用额外的代码来对学生进行分组,但是检查学生总数是否为5的倍数的基本思想不会改变。

<?php

$total_students = 25;

if($total_students % 5 == 0) {
    echo 'Each group of five students has been given an assignment.';
} else {
    echo 'Sorry, it is impossible to create groups of five students right now. Please get more students.';
}

?>

将数字更改为其他数字的倍数

在上一节中,我们使用了模运算符来通知用户仅提供特定倍数的输入值。 如果这不可能,我们也可以强制输入为5的倍数或其他数字的偶数。

模运算符提供第一个数字除以第二个数字后剩下的整数。 这意味着从第一个数字减去余数将使其成为第二个数字的倍数。 例如,通过取28%5为模,可以将28更改为5的倍数。在这种情况下,模的取值为3。我们现在可以从原始数字中减去3,使其成为5的倍数。行会通过从中减去适当的值来将任何正数x强制为另一个正数y的倍数。

x = x - (x % y)

在前面的示例中有28名学生,我们可以只剩下3名学生,然后将其他学生分组。

<?php

$total_students = 28;

if($total_students % 5 == 0) {
    echo 'Each group of five students has been given an assignment.';
} else {
    $removed_students = $total_students % 5;
    $total_students -= $removed_students;
    echo 'We have created groups of five students by removing the last '.$removed_students.' students from the list.';
}

?>

限制输入

正如我在文章开头提到的那样,对于正数,取模运算符将返回一个介于0和N-1之间的数字,其中N是除数。 这意味着您可以为任何输入设置上限,并重复且顺序地执行一些操作。 这是一个例子:

<?php

$colors = ['violet', 'indigo', 'blue', 'green', 'yellow'];

$color_count = count($colors);
$total_images = 180;
$background_color = '';

for($i = 0; $i < $total_images; $i++) {
    $background_color = $colors[$i % $color_count];
    echo "Setting image background color to $background_color.";
}

?>

在上面的示例中,我们只有五种颜色,但是总共有180张图像。 这意味着我们将不得不循环遍历相同的五种颜色并将它们分配给我们的所有图像。 模运算符完美地满足了这一需求。 它将$i % $color_count的值限制在0到( $i % $color_count )或4之间。 换句话说,我们将能够非常容易地顺序选择数组中的所有颜色。

每N次循环执行一些任务

遍历循环时,我们可以检查每次循环时递增的变量值,并在第n次迭代后执行特定任务。 我想到的一个实际用例是为用户更新一个长期运行的过程。 假设您正在使用PHP对1,000个不同的图像进行更改。 如果更改很大,此过程将花费一些时间来更新所有图像。

在这种情况下,用户将无法知道程序是否被卡住或实际上没有任何进展。 您可以做的是在编辑完每10张图像后向用户报告进度。

<?php

$total_images = 1000;

for($i = 1; $i <= $total_images; $i++) {
    update_images($image_resource);
    if($i % 10 == 0) {
        $percent = $i*100/$total_images;
        echo 'Already processed '.$percent.'% images.';
    }
}

?>

上面示例中的update_images()函数已完全组成,但是您可以用其他过程来代替它,例如调整图像大小,添加水印,将它们变成灰度等。(如果想学习,请查看我的PHP GD图像编辑教程。如何自己以编程方式在PHP中编辑图片。)

在不同的度量单位之间转换

模运算符还可以用于在不同的度量单位之间进行转换。 例如,您可以使用它来将以秒为单位的持续时间更改为以小时,分钟和秒为单位的持续时间。 同样,您也可以将大量厘米转换为公里,米和厘米。 这是一个例子:

<?php

$total_seconds = 32987;

$hours = (int)($total_seconds / 3600);
$minutes = (int)(($total_seconds - 3600 * $hours )/60);
$seconds = $total_seconds % 60;

echo 'Hours:'.$hours.' Minutes:'.$minutes.' Seconds:'.$seconds.'';

?>

我们首先将总秒数除以3600,然后将值转换为整数。 因为每个小时有3600秒,所以这给了我们总的小时数。

在下一步中,我们从原始秒数中减去3600 * $hours 。 这消除了我们已转换为小时的所有秒数。 现在除以60将得到总分钟数。 最后,我们使用模运算符来获取秒数。

最后的想法

正如您在本教程中所看到的那样,模运算符虽然易于使用,但具有许多应用程序。 我们通过查看正数和负数以及浮点数的模数开始了本教程。 之后,我们介绍了一些使用模数的常见方案。

如果您对本教程有任何疑问,请在评论中让我知道。 您还有其他模数用途吗? 请在下方发布与其他读者分享的内容。

翻译自: https://code.tutsplus.com/tutorials/how-to-use-the-modulo-operator-in-php--cms-32393

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值