2 回答
TA贡献1111条经验 获得超0个赞
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')
它将返回 0 :)
正如我在评论中提到的,您可以用以下函数替换您的函数:
substr_count
代替countOccurrence
range
代替makeArray
如果您想坚持自己的职能。将输入转换为 int,然后使用intval将其传递给函数。
TA贡献1860条经验 获得超9个赞
这就是你的小怪物所在的地方……
if($lastDigit === $digit){
您在这里期望的是按值和按类型进行比较(===)。
您可以使用 gettype() 来验证这一点;
while ($number > 0) {
$lastDigit = $number % 10;
echo '$lastDigit is a '.gettype($lastDigit);
echo ' $digit is a '.gettype($digit);
echo '<br>';
if ($lastDigit === $digit) {
$result++;
}
$number = ($number - $lastDigit) / 10;
}
来自 POST 的值始终是 String 类型。因为 $digit 是一个字符串,$lastDigit 是一个数字(整数)。使用 === 将失败,因为它们不是同一类型。
因此,由于 PHP 具有自行类型转换的能力...将 === 更改为 == 就可以了。IE
if ($lastDigit == $digit) {
PHP 将尝试将 RHS 值转换为 LHS 类型,然后执行比较。
所以现在您只是执行比较,PHP 正在将 $digit 转换为整数。
更安全的方法是强制铸造。因此,您可以将 $digit 从字符串转换为整数,并使用现有的代码。
function countOccurrence($number, $digit) {
$result = 0;
$digit = intval($digit); // Force $digit to be an integer
while ($number > 0) {
$lastDigit = $number % 10;
echo '$lastDigit is a '.gettype($lastDigit);
echo ' $digit is a '.gettype($digit);
echo '<br>';
if ($lastDigit === $digit) {
$result++;
}
$number = ($number - $lastDigit) / 10;
echo ' $number is a '.gettype($number);
}
return $result;
}
因此,从中吸取的教训是,当使用 === 时,请确保您的类型也相同。
- 2 回答
- 0 关注
- 90 浏览
添加回答
举报