foreach,元素的意外结果,哪个键为0

时间:2012-11-21 13:53:05

标签: php arrays foreach

我有这段代码

$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,则现在创建了链接。有什么问题?

6 个答案:

答案 0 :(得分:5)

这是因为0 == "thispage"而第一个键是0。要了解有关此内容的更多信息,请查看有关Type Juggling

的PHP手册页

使用===(“与”相同“)代替==(”等于“),因为0 等于到{{1 },但不是相同的

"thispage"

会发生这种情况
  • ==获取$key
  • integer
  • PHP尝试比较0
  • 为了进行比较,需要将0 == "thispage"投射到"thispage"
  • 结果比较为integer,即0 == 0

如果您使用true

  • ===获取$key
  • integer
  • PHP尝试比较0
  • 由于0 === "thispage"的类型与0integer)的类型不同("thispage"),因此结果为string

答案 1 :(得分:2)

执行:

if ($k === "thispage")

你必须使用相同的比较运算符 ===,因为相等的比较运算符在这里无济于事,因为

  

如果您将数字与字符串进行比较或比较涉及   数字字符串,然后每个字符串转换为一个数字和   比较用数字表示。

转换为数字的

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

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

答案 2 :(得分:2)

这就是你做错了。

if ($k === "thispage") {
    echo .$k." ";
}

答案 3 :(得分:1)

试试这个:

if ($k === "thispage") {
        echo $k." ";
    }

答案 4 :(得分:1)

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

  

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

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

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

答案 5 :(得分:0)

您看到的结果的原因是您使用的比较运算符。 ==有时候太不精确了,可能导致像这样的奇怪事情。使用===将比较准确性的值,并防止出现问题。

所以:

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