PHP中的Foreach循环问题

7

这里有一些我写的代码: (p只是回显并添加换行符)

foreach ($vanSteps as $k => $reqInfo) 
{
    p($k);
    if ('van' == $k) { p('The key is the van, continue'); continue; }//continue if we reached the part of the array where van is key
    //do stuff
}

我得到了这个输出:

0
The key is the van, continue
1
2
3
van
The key is the van, continue

为什么当键是0时,if语句会返回true?此foreach循环处理逻辑,当键==0(和除了键为“van”之外的任何其他键)时应用逻辑,并且这会破坏逻辑,因为当键为0时它会返回true。
需要帮忙吗?
谢谢。

可以在 $vanSteps 上看到一个 print_r 吗? - Phil
7个回答

12

使用===进行比较。当PHP比较字符串和整数时,它首先将字符串强制转换为整数值,然后再进行比较。

请参阅手册中的比较运算符


...并且'van' == 0,但'van' !== 0 - Julian
1
谢谢,这个方法可行。以后调试时我会记得使用的。=] - y3di
这是一个常见的错误,在许多PHP教程中经常被忽视。 - piotrp
这绝对不是一个普遍的错误,或许是常见的。 - salathe

6
在PHP中,'van' == 0的结果是true。这是因为当使用==来比较一个字符串和一个数字时,字符串会被转换为数字(如下面第二个链接所述)。这使得内部比较成为0 == 0,当然是true
建议您使用严格的相等比较===满足您的需求。
请参见比较运算符字符串转换为数字

2
在PHP中,当你比较两种类型时,它必须将它们转换为相同的类型。在你的情况下,你比较了stringint
在内部,这将被转换为 if((int)'van'==0).... 然后 if((int)'van'==1).... (int)'任何可能的字符串'将是0 :) 因此,你必须手动将两个值转换为相同的类型,或者使用===作为比较运算符,而不是松散的=
此规则的一个例外(如评论中指出的)是,如果字符串以数字开头,或者可以以任何方式解释为数字(1、0002、-1等),则该字符串将被解释为数字,忽略非数字字符串的结尾。
请查看http://php.net/manual/en/types.comparisons.php获取更多详细信息。

应该是“(int)'任何可能不以数字开头的字符串'将是0 ;) - Felix Kling
@Felix - 字符串可以以非数字字符开头,仍然被解释为不是零的其他内容。 - salathe
@salathe: 你是指符号吗?我只是想指出,并非所有字符串都会转换为零... - Felix Kling
@Felix,好的。下次说清楚你的意思。 :) - salathe

0

这个很好用:

$array = array(0=>"a",1=>"b","van"=>"booya!");

function p($v){ echo "{$v}<br />"; }

foreach ($array as $k => $reqInfo) 
{
    p($k);
    if ('van' === $k) { p('The key is the van, continue'); continue; }//continue if we reached the part of the array where van is key
    //do stuff
}

输出:

0
1
van
The key is the van, continue

请注意使用 ===

0

阅读各种类型表格比较。当操作数之一为数字时,另一个操作数也会被转换为数字。由于“van”是非数字字符串,因此它被转换为0。在这种情况下,您应该使用===运算符,它还检查变量类型。


0

它将'van'解释为布尔值(false),而0等于该值。

在PHP中,要检查类型和值的完全匹配,必须使用===而不是==


0

这是因为 'van' == 0 (true)。

相反,你应该使用 'van' === 0 (false)。

简而言之,应该使用 === 而不是 ==。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接