为什么intval()在这里返回0


Why is intval() returning 0 here?

因此,根据文档,如果我在intval()中放入一个字符串,它应该返回所述字符串的整数。但是,当我给它一个字符串值为数字的变量时,它会吐出"0",而不是相应的数字。

这段代码是我编写的,我试图将网站存档部分的图像页码转换为标题。

<?php
    $filename = basename($_SERVER['REQUEST_URI']);
    function countDigits($str) {
        $numDigits=0;
        for ($i=0; $i < strlen($str); $i++) {
            if (is_numeric($str[$i])) {
                $numDigits++;
            }
        }
        return $numDigits;
    }
    $digits = countDigits($filename);
    $thisPageNum = intval(substr($filename, -$digits, $digits), 10);
    if ($thisPageNum = 0) {
        echo '<title>Unfetched Page #</title>';
    }
    else {
        echo '<title>Archive: Page ' . $thisPageNum . '</title>';
    }
?>

因此,试图找到这个问题表明,intval返回的是0,而不是适当的数字。为了澄清,为该测试获取的页面名称最终为:archive.php?p=2,数字(1)被正确计数,子字符串(2)被正确提取。此外,结尾的if语句检查$thisPageNum=0是否未触发并给出错误消息。它总是发出Else回声(返回档案:第0页)。

所以我想我有三个问题。我是不是完全误解了intval()的工作原理?这不是一种做str2int的方式吗?有没有其他方法可以实现我所要求的str2int结果?

免责声明:我已经扰乱php大约24小时了。如果你开始陷入一堆疯狂的事情中,比如get,请解释他们在做什么,因为我可能不理解,我不喜欢使用我不理解的代码。谢谢,:)

编辑:我通过在这里打字纠正了我犯的愚蠢的小错误。这两个错误实际上并不存在。

我认为您通常缺少更简单的方法。所以我认为你在调用archive.php?p=2,并试图解析出p的值?

所以,欢迎使用PHP,以及更简单的方法$_GET

$thisPageNum = (int)$_GET['p'];

为了解释这一点,$_GET是一个全局数组,它包含所有查询字符串引用的值。(int)是在PHP中进行类型转换的方式。因此$thisPageNum将始终包含一个整数。这应该能更好地满足你的需求。

您的代码中有几个错误:

function countDigits($str) {
    $numDigits=0;
    for ($i=0; $i < strlen($str); $i++) {
        if (is_numeric($str[i])) {//<- should be $i, not i
            $numDigits++;
        }
    }
    return $numDigits;
}

第二个错误:

$digits = countDigits();//function called without any inputs

我更正了你的代码,并用示例数据运行了它:

<?php
function countDigits($str) {
    $numDigits=0;
    for ($i=0; $i < strlen($str); $i++) {
        if (is_numeric($str[$i])) {
            $numDigits++;
        }
    }
    return $numDigits;
}
$str = "archive.php?p=2";
$digits = countDigits($str);
$thisPageNum = intval(substr($str, -$digits, $digits), 10);
print $thisPageNum;

输出:

2