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

模运算符做什么?

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

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

以下是几个示例:

<?phpecho 1089 % 37;
// Output: 16echo 1089 % -37;
// Output: 16echo -1089 % 37;
// Output: -16echo -1089 % -37;
// Output: -16echo -55.4 % -4.2;
// Output: -3echo -55.9 % -4.8;
// Output: -3echo -55 % -4;
// Output: -3?>

浮点模数

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

$dividend = i*$divisor + $remainder

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

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

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

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

<?phpecho fmod(18.8, 2);
// Output: 0.8echo 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

如何在PHP中使用Modulo运算符相关推荐

  1. 如何在JavaScript中获取时间戳

    如何在JavaScript中获取时间戳 +运算符 我们可以使用+运算符将日期对象直接转换为UNIX时间戳. 例如,我们可以这样写: +new Date() +日期对象之前操作者触发valueOf的方法 ...

  2. 负数modulo运算_Java Modulo Operator-Java中的Modulus运算符

    负数modulo运算 Java Modulo operator or modulus operator is used to getting the remainder when we divide ...

  3. regexp 好汉字符串_如何在JavaScript中使用RegExp确认字符串的结尾

    regexp 好汉字符串 by Catherine Vassant (aka Codingk8) 由凯瑟琳·瓦森(Catherine Vassant)(又名Codingk8) 如何在JavaScrip ...

  4. 如何在 bash 中使用索引数组

    数组是一种数据结构,表示具有相同数据类型的对象集合.bash shell中支持两种类型的数组:关联数组或索引数组.在本文中,将演示如何在 bash 中使用索引数组.以下使用 shell 示例来说明索引 ...

  5. 如何在 bash 中使用键值字典

    在字典中,字典存储一组键,每个键都有一个与之关联的值.可以使用对应的键在字典中插入.检索或更新值.字典数据结构针对基于键值的快速检索进行了优化,因此通常使用哈希表来实现.在不同的编程语言中,字典通常有 ...

  6. 如何在R中正确使用列表?

    本文翻译自:How to Correctly Use Lists in R? Brief background: Many (most?) contemporary programming langu ...

  7. 如何在PowerShell中使用带有空格和引号的参数运行EXE文件

    本文翻译自:How to run an EXE file in PowerShell with parameters with spaces and quotes How do you run the ...

  8. 如何在MySQL中声明变量?

    本文翻译自:How to declare a variable in MySQL? How to declare a variable in mysql, so that my second quer ...

  9. 如何在Swift中串联或合并数组?

    本文翻译自:How do I concatenate or merge arrays in Swift? If there are two arrays created in swift like t ...

最新文章

  1. 一周一论文(翻译)——[PVLDB 17] Dhalion: 基于Heron自适应调整的流处理系统
  2. 121. Leetcode 5. 最长回文子串 (动态规划-子序列问题)
  3. 建设世界级数据中心正当时
  4. 前端页面高度和宽度自适应怎么做?
  5. css word-wrap_CSS中分词“ break-all”和“ break-word”的值之间的差异
  6. 数据结构排序系列详解之三 冒泡排序
  7. 村上隆首场中国直播,火山同传打造“影院级字幕”
  8. Quartz简单理解
  9. 网易公开课专辑下载脚本python
  10. 这三个究极骚气的炫酷底部导航栏,只有经常逛GitHub划水的人才知道!
  11. 工具 - UI原型设计工具Pencil Project
  12. 2.3.4nbsp;《孙子兵法》的基本原则
  13. 如何进入进计算机组策略,如何进入组策略?
  14. [案例4-6]研究生薪资管理
  15. Word Ladder II
  16. ARCGIS矢量数据的空间分析——叠加分析
  17. 如何用计算机二进制进行计算,计算机如何实现二进制数据运算
  18. 赢在项目工具的落地-讲师团俊平老师主讲
  19. LU分解法c语言程序设计,矩陣LU分解求逆详细分析与C语言实现.doc
  20. 可用内存不够异常问题的处理

热门文章

  1. 使用ls筛选某一天的文件
  2. 洛谷 B2006 地球人口承载力估计
  3. JAVA学习记录(冲冲冲)
  4. 令人不寒而栗的黄蓉(转)
  5. 【windows 壁纸】
  6. 纯净正版 WIN10 安装文件官方下载
  7. 钉钉视频下载方法地瓜网络钉钉视频下载器
  8. 关于批量下载MODIS数据的坑
  9. wps如何保存最终状态_Word 无法保存“最终状态”
  10. Tensorflow环境搭建