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”等等


我不太确定这里出了什么问题,因为当我手动测试该功能时它看起来没问题


慕工程0101907
浏览 91回答 2
2回答

catspeake

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代替countOccurrencerange代替makeArray如果您想坚持自己的职能。将输入转换为 int,然后使用intval将其传递给函数。

慕码人2483693

这就是你的小怪物所在的地方……if($lastDigit === $digit){您在这里期望的是按值和按类型进行比较(===)。您可以使用 gettype() 来验证这一点;while ($number > 0) {&nbsp; &nbsp; $lastDigit = $number % 10;&nbsp; &nbsp; echo '$lastDigit is a '.gettype($lastDigit);&nbsp; &nbsp; echo ' $digit is a '.gettype($digit);&nbsp; &nbsp; echo '<br>';&nbsp; &nbsp; if ($lastDigit === $digit) {&nbsp; &nbsp; &nbsp; &nbsp; $result++;&nbsp; &nbsp; }&nbsp; &nbsp; $number = ($number - $lastDigit) / 10;}来自 POST 的值始终是 String 类型。因为 $digit 是一个字符串,$lastDigit 是一个数字(整数)。使用 === 将失败,因为它们不是同一类型。因此,由于 PHP 具有自行类型转换的能力...将 === 更改为 == 就可以了。IEif ($lastDigit == $digit) {PHP 将尝试将 RHS 值转换为 LHS 类型,然后执行比较。所以现在您只是执行比较,PHP 正在将 $digit 转换为整数。更安全的方法是强制铸造。因此,您可以将 $digit 从字符串转换为整数,并使用现有的代码。function countOccurrence($number, $digit) {&nbsp; &nbsp; $result = 0;&nbsp; &nbsp; $digit = intval($digit); // Force $digit to be an integer&nbsp; &nbsp; while ($number > 0) {&nbsp; &nbsp; &nbsp; &nbsp; $lastDigit = $number % 10;&nbsp; &nbsp; &nbsp; &nbsp; echo '$lastDigit is a '.gettype($lastDigit);&nbsp; &nbsp; &nbsp; &nbsp; echo ' $digit is a '.gettype($digit);&nbsp; &nbsp; &nbsp; &nbsp; echo '<br>';&nbsp; &nbsp; &nbsp; &nbsp; if ($lastDigit === $digit) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $result++;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; $number = ($number - $lastDigit) / 10;&nbsp; &nbsp; &nbsp; &nbsp; echo ' $number is a '.gettype($number);&nbsp; &nbsp; }&nbsp; &nbsp; return $result;}因此,从中吸取的教训是,当使用 === 时,请确保您的类型也相同。
打开App,查看更多内容
随时随地看视频慕课网APP