2

我有这个代码

$arr = array(
    "0"=>"http://site.com/somepage/param1/param2/0",
    "1"=>"http://site.com/somepage/param1/param2/1",
    "thispage" => "http://site.com/somepage/param1/param2/2",
    "3"=> "http://site.com/somepage/param1/param2/3"
);



foreach ($arr as $k=>$v) {
    if ($k == "thispage") {
        echo $k." ";
    }
    else {
        echo '<a href="'.$v.'">'.$k.'</a> ';
    }
}

令人惊讶的是,对于"0"=>"http://site.com/somepage/param1/param2/0",未创建链接的第一个元素,(对于其他元素工作正常)

如果在其他东西上替换第一个元素键0,例如4,现在创建链接。怎么了 ?

4

6 回答 6

5

发生这种情况是因为0 == "thispage"第一个键是0. 要了解更多信息,请查看关于Type Juggling的 PHP 手册页。

使用===("is same to") 代替==("is equal to"),因为0is equal to "thispage",但不完全相同

这就是发生的情况==

  • $key取值integer0
  • PHP 尝试比较0 == "thispage"
  • 为了进行比较,它需要转换"thispage"integer
  • 结果比较0 == 0true

如果您使用===

  • $key取值integer0
  • PHP 尝试比较0 === "thispage"
  • 因为( ) 与( )0的类型不同,所以结果是integer"thispage"stringfalse
于 2012-11-21T13:57:21.753 回答
2

执行以下操作:

if ($k === "thispage")

您必须使用相同的比较运算符 ===,因为相等的比较运算符在这里没有帮助,因为

如果将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都将转换为数字并以数字方式执行比较。

thispage转换为数字将返回0,因此如果您使用相等比较运算符,您的 if 语句将匹配==。当您进行相同比较===时,如果类型不匹配,则返回 false。

您可以在此处阅读有关比较运算符的信息。

于 2012-11-21T13:58:02.690 回答
2

这是你做错了什么。

if ($k === "thispage") {
    echo .$k." ";
}
于 2012-11-21T13:59:28.710 回答
1

试试这个:

if ($k === "thispage") {
        echo $k." ";
    }
于 2012-11-21T13:58:34.640 回答
1

http://us.php.net/manual/en/language.types.array.php

键可以是整数或字符串。如果键是整数的标准表示,它将被解释为这样(即“8”将被解释为 8,而“08”将被解释为“08”)。

因此,在您的情况下,Stings"1", "2" and "3"被视为整数。

要解决此问题,请使用===检查类型和值的运算符。

于 2012-11-21T14:00:40.133 回答
0

您看到结果的原因是您使用的比较运算符。== 有时过于不精确,可能会导致类似这样的奇怪事情。使用 === 将比较值的准确性,并防止您遇到的问题。

所以:

foreach ($arr as $k=>$v) {
    // this is the important thing
    if ($k === "thispage") {
        echo $k." ";
    }
    else {
        echo '<a href="'.$v.'">'.$k.'</a> ';
    }
}
于 2012-11-21T14:01:58.640 回答