php - PHP函数在循环中返回0
问题描述
我有一个简单的 PHP 函数,可以计算整数中特定数字的个数
function countOccurrence($number, $digit){
$result = 0;
while ($number > 0){
$lastDigit = $number % 10;
if($lastDigit === $digit){
$result++;
}
$number = ($number - $lastDigit)/10;
}
return $result;
}
它自己完全可以正常工作[用 countOccurrence(1111, 1) 测试并返回 4]
但是当我在一个循环中使用它时,它总是返回 0。
if (isset($_POST['submit'])){
$startNum = $_POST['startNum'];
$endNum = $_POST['endNum'];
$findNum = $_POST['findNum'];
$occur = 0;
echo 'from ' . $startNum . ' to ' . $endNum . ' find how many times ' . $findNum . ' occurs';
echo '<br>';
$numRange = makeArray($startNum, $endNum);
foreach ($numRange as $number){
$test = countOccurrence($number, $findNum);
echo 'number: ' . $number . ' find: ' . $findNum . ' countOccurrence('.$number.', '.$findNum.'): ' . $test . '<br>';
}
echo '<br>';
echo '<p>The digit ' . $findNum . ' occurred ' . $occur . ' times within the range</p>';
echo '<br>';
echo 'countOccurrence(1111, 1) = ';
$test = countOccurrence(1111, 1);
echo $test;
}
我从中得到的结果是“number: 1 find: 1 countOccurrence(1, 1): 0”等等
我不确定这里哪里出了问题,因为当我手动测试功能时它看起来没问题
编辑:这是我的完整代码
<html lang="en">
<head>
<title>Number Counter</title>
<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<form id="form" class="form-group" action="" method="post">
<div class="form-group">
<label for="startId">Start Num</label>
<input type="number" name="startNum" id="startId" class="form-control">
</div>
<div class="form-group">
<label for="endId">End Num</label>
<input type="number" name="endNum" id="endId" class="form-control">
</div>
<div class="form-group">
<label for="findId">Find Num</label>
<input type="number" name="findNum" id="findId" class="form-control">
</div>
<input type="submit" name="submit">
</form>
</div>
<script src="bootstrap/js/jquery-3.5.1.min.js"></script>
<script src="bootstrap/js/jquery.validate.min.js"></script>
<script src="bootstrap/js/bootstrap.min.js"></script>
<script src="validate.js"></script>
</body>
</html>
<?php
function countOccurrence($number, $digit){
$result = 0;
while ($number > 0){
$lastDigit = $number % 10;
if($lastDigit === $digit){
$result++;
}
$number = ($number - $lastDigit)/10;
}
return $result;
}
function makeArray($startNum, $endNum){
$numRange = array();
for($ctr = $startNum; $startNum <= $endNum; $startNum++){
array_push($numRange, $startNum);
}
return $numRange;
}
if (isset($_POST['submit'])){
$startNum = $_POST['startNum'];
$endNum = $_POST['endNum'];
$findNum = $_POST['findNum'];
$occur = 0;
echo 'from ' . $startNum . ' to ' . $endNum . ' find how many times ' . $findNum . ' occurs';
echo '<br>';
$numRange = makeArray($startNum, $endNum);
foreach ($numRange as $number){
$test = countOccurrence($number, $findNum);
echo 'number: ' . $number . ' find: ' . $findNum . ' countOccurrence('.$number.', '.$findNum.'): ' . $test . '<br>';
}
echo '<br>';
echo '<p>The digit ' . $findNum . ' occurred ' . $occur . ' times within the range</p>';
echo '<br>';
echo 'countOccurrence(1111, 1) = ';
$test = countOccurrence(1111, 1);
echo $test;
}
编辑:感谢您的回答!我最终将 $_POST 值解析为 int ,而不是像这样以获得预期值
$startNum = (int) $_POST['startNum'];
$endNum = (int) $_POST['endNum'];
$findNum = (int) $_POST['findNum'];
解决方案
function countOccurrence($number, $digit){
$result = 0;
while ($number > 0){
$lastDigit = $number % 10;
if($lastDigit === $digit){ // <-- bug is here
$result++;
}
$number = ($number - $lastDigit)/10;
}
return $result;
}
由于您正在进行严格比较,因此这些值永远不会相等。原因如下:
当您从 $_POST 获取数据时,它始终是一个字符串。所以你正在调用countOccurrence(1111, '1')
which 将返回 0 :)
正如我在评论中提到的,你可以用这些替换你的函数:
substr_count
代替countOccurrence
range
代替makeArray
如果你想坚持你的功能。将您的输入转换为 int,然后再使用intval将其传递给您的函数。
附加信息
推荐阅读
- oracle - Jenkins - Sqlplus 脚本运行插件 - 无法加载共享库
- javascript - EJS:如果这则显示长度
- php - 我在使用 foreach 循环的数组中遇到问题
- c# - 当我使用 Xpath 在 Selenium C# 中搜索元素时,我的测试总是失败
- c++ - 如何将“hello world”从 C++/MFC 对话框应用程序打印到特定打印机
- ios - iOS 应用程序在启动屏幕后崩溃
- javascript - 你将如何使用 react-router 实现拆分视图界面?
- scala - Gatling - Scala 中的字符串插值
- node.js - 卸载 Ijavascript 和 ijs
- ssl - 如何理解为什么我在 Heroku 上有随机 TLS 问题?