首页 > 解决方案 > 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'];

标签: php

解决方案


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 :)

正如我在评论中提到的,你可以用这些替换你的函数:

如果你想坚持你的功能。将您的输入转换为 int,然后再使用intval将其传递给您的函数。

附加信息

以防止将来发生这种情况。看看这个帖子。它是php的一个相对较新的特性,是针对这类场景引入


推荐阅读