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

Php 为什么intval()在这里返回0?,php,web,Php,Web,因此,根据文档,如果我在intval()中放入一个字符串,它应该返回所述字符串的整数。但是,当我向它提供一个字符串值为数字的变量时,它会吐出“0”而不是相应的数字 这段代码就是我试图将我网站存档部分中的图像页码转换为标题的代码 <?php $filename = basename($_SERVER['REQUEST_URI']); function countDigits($str) { $numDigits=0; for ($i=0; $i

因此,根据文档,如果我在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,请解释他们在做什么,因为我可能不理解,我不喜欢使用我不理解的代码。谢谢,:)


编辑:我修正了我在这里输入的愚蠢的小错误。这两个错误实际上并不存在。

您的代码中有几个错误:

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;
}
我更正了您的代码,并使用示例数据运行了它:

<?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;

我觉得你总的来说错过了更简单的方法。所以我认为您正在调用
archive.php?p=2
并试图解析
p
的值

因此,欢迎使用PHP,这是一种更简单的方法,
$\u GET

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

为了解释这一点,
$\u GET
是一个全局数组,它包含所有查询字符串引用的值
(int)
是您在PHP中键入内容的方式。因此,
$thisPageNum
将始终包含一个整数。这对于你想要的东西来说应该会更好。

可能是@m59的副本我读了一遍,但这并没有帮助我弄清楚发生了什么。顺便说一句:最后一个
if()
总是正确的,因为它包含一个赋值,而不是一个比较!最好使用这个工具。在PHP中,您必须使用
“==”
进行简单的值比较,使用
“==”
进行值和类型安全比较。这两个错误是因为我手动写出了此注释,我深表歉意。我不想从ssh复制它。这两个错误实际上并不存在于页面上!此外,我检查了,当我直接输入文件名时,它似乎确实起作用,但当我使用$filename时,它就不起作用了。我正在使用的调用是否会以某种方式将文件弄乱?因此我了解到,使用
$\u get
可以轻松完成这里的所有操作。但是,我很好奇,为什么输入包含
'2'
字符串值的intval my变量没有提供2结果,而输入原始
2
却没有。有什么想法吗?@user3055758这真的很奇怪。您必须进行一些调试。尝试打印$filename并查看其值。我做了大量调试。$filename的值是我提到的“archive.php?p=2”。数字被正确地计数(在本例中为1),子字符串正确地捕获了数字。完成所有这些操作后,在运行intval之前,变量$thisPageNum将保存一个字符串2。然后intval返回0而不是2的整数。@user3055758很遗憾,无法告诉您任何事情。它可用于手动输入字符串,而不可用于$\u服务器['REQUEST\u URI']。他们之间一定有一些不同,我们忽略了。好吧,我需要先得到关于页面的信息(因此是Request_URI。我如何用这种方式从变量中获取查询int?没关系!我甚至不必向它输入变量。非常整洁。我想我需要更多地研究超全局变量。我不能投票给你,因为我没有代表,但我给了你答案,因为我给了我一个更简单的方法来完成这项工作!
2
$thisPageNum = (int)$_GET['p'];