2011-04-18 91 views
2

我有这样的代码:奇怪的行为。如果到了

for($nrt=0; $nrt<$actualline; $nrt++) { 
    echo $sidesIndexes[$nrt]." - ".$nrt."<br/>"; 
    if($sidesIndexes[$nrt]==$nrt) { 
     echo "am I in??? ".$sidesIndexes[$nrt]." is different than ".$nrt."<br/>"; 
    } 
} 

打印:

# - 0 
am I in??? # is different than 0 
# - 1 
# - 2 
# - 3 
# - 4 
# - 5 
# - 6 
# - 7 
# - 8 
# - 9 
# - 10 
# - 11 
# - 12 
# - 13 
# - 14 
# - 15 
# - 16 
# - 17 
# - 18 
# - 19 

我是累了吗?如何获得am I in??? # is different than 0消息?

回答

5

在进行比较时,the "#" string is converted to a numeric value,它给出。

然后是,0 == 0,

您应该使用===与检查变量类型进行比较:

if($sidesIndexes[$nrt] === $nrt) { 

如果这两个变量都只会是真实的相同的类型(如整数,字符串等)。

1
+1

这是为什么?我很感兴趣。 – 2011-04-18 15:23:33

+0

@Daniel A. White'var_dump((integer)'#')'是'int(0)'。 PHP试图通过将值转换为通用类型来评估比较操作。在这种情况下,整数。由于(字符串)#转换为(整数)0,因此此操作结果为true。 – 2011-04-18 15:24:43

1

我假定这是PHP,因为它看起来像它。 Zero在PHP中评估许多事情。在这种情况下,它看起来像0 == null。要在类型也被检查的情况下进行强大的相等比较,请使用===。

0 == null // true 
0 == false // true 
0 == 0 // true 

0 === null // false 
0 === false // false 
0 === 0 // true 
+0

没有字符串没有解析为空,但为0. – 2011-04-18 15:28:38

+0

明白了。然后0 == 0仍然是真的。如果你不想'#'== 0为真,那么三等于仍然适用于你。 – Brad 2011-04-18 15:30:43

+0

不会,但这意味着'''=== 0'不是真的。使用'==='不会奇迹般地改变'=='的含义。 – 2011-04-18 15:36:37

0

0与PHP中的false相同。 PHP中的字符'#'不正确。所以,你问的是假==假,它是。

+0

我认为字符串“#”正被转换为一个数值(它给出0)而不是一个布尔值。 – 2011-04-18 15:29:25

0

如果你尝试不同类型比较,那么你应该使用===操作 如果($ sidesIndexes [$ NRT] === $ NRT){ .... }

指数的复数是指数 方?你的意思是网站?

+0

索引=我的意思是很多索引:) – markzzz 2011-04-18 15:33:25

1

在PHP(以及其他松散类型的语言,如Javascript)中,使用双等号运算符==比较两个不同类型的变量时存在一个主要问题。

这两个变量是不同的类型,但PHP只能比较相同类型的实体,所以当它看到比较的尝试时,它会自动转换实体以使它们属于相同类型。

这样做的结果是,如果您将字符串值"#"与数字零进行比较,则会在进行比较之前将该字符串转换为数字。由于这会导致数值为零,因此它等于它与之比较的数字零,导致if()条件返回true。

在某些情况下,这实际上是所需的效果 - 例如,来自浏览器中的所有数据(如$_POST等)都将是字符串,即使它实际上可能是数字数据。

但是,在许多情况下,双等号的隐式类型转换是一个主要问题。

对此的解决方案是tripple-equal运算符 - ===

这与双等号运算符完全相同,不同之处在于它不首先执行类型转换。如果类型不一样,那么它总是返回false。

因此,如果您有tripple-equal,则包含数字"2"的字符串不会等于2的整数值,也不会等于浮点值2.00。但与双等号,他们都是平等的。

就你而言,你需要使用tripple-equal操作符。两者都有它们的用途,并且您应该使用适合于任何特定情况的任何一种。

+0

清除!谢啦 :) – markzzz 2011-04-18 22:29:42