在PHP中的Foreach循环问题

时间:2011-08-26 13:18:49

标签: php loops foreach

以下是我的一些代码:( p只是echos plus添加换行符)

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循环处理当key == 0时应用的逻辑(以及任何其他键,除非键是'van')并且这会混淆逻辑,因为当key为0时它返回true。

任何帮助?

谢谢。

7 个答案:

答案 0 :(得分:12)

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

请参阅手册中的Comparison Operators

答案 1 :(得分:6)

在PHP中'van' == 0true。这是因为当使用==比较字符串和数字时,字符串将转换为数字(如下面的第二个链接所述);这使得内部比较成为0 == 0,当然是true

根据您的需求建议的替代方案是使用===进行严格的相等比较。

请参阅Comparison OperatorsString conversion to numbers

答案 2 :(得分:2)

在PHP中,比较2种类型时,必须将它们转换为相同的类型。在您的情况下,您将stringint进行比较。 在内部,这将转换为

if((int)'van'==0).... 然后 if((int)'van'==1)....

(int)'任何可能的字符串'将是0 :)所以你要么必须手动将两个值转换为相同的类型,要么使用===作为比较运算符,而不是松散=。 此规则的一个例外(如注释中所指出的)将是字符串以数字开头,或者可以以任何方式解释为数字(1,0002,-1等)。在这种情况下,字符串将被解释为数字,指向非数字字符串结尾的结尾

请查看http://php.net/manual/en/types.comparisons.php了解详情。

答案 3 :(得分: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

请注意===

答案 4 :(得分:0)

阅读Comparison with Various Types table 当其中一个操作数为数字时,另一个操作数也将转换为数字。由于'van'是非数字sting,它被转换为0.你应该使用===运算符,这也检查变量类型

答案 5 :(得分:0)

'van'解释为布尔值(false),其中0等于。

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

答案 6 :(得分:0)

那是因为'van' == 0(真实)。

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

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