为了账号安全,请及时绑定邮箱和手机立即绑定

PHP 函数如果在循环中则返回 0

PHP 函数如果在循环中则返回 0

PHP
慕工程0101907 2023-10-15 16:49:07
我有一个简单的 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”等等我不太确定这里出了什么问题,因为当我手动测试该功能时它看起来没问题
查看完整描述

2 回答

?
catspeake

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将其传递给函数。

查看完整回答
反对 回复 2023-10-15
?
慕码人2483693

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;

}

因此,从中吸取的教训是,当使用 === 时,请确保您的类型也相同。


查看完整回答
反对 回复 2023-10-15
  • 2 回答
  • 0 关注
  • 90 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信