PHP:If语句问题

PHP:If语句问题,php,Php,数组resAlloc包含10列和5行。所有条目都等于0。所以,我希望下面的IF语句是正确的,但由于某些原因它是错误的。。。为什么? if ($resAlloc[$i][$j] != 'ts' && $resAlloc[$i][$j] != 't' && $resAlloc[$i][$j] != 'st') { $count++; } IIRC任何等于0的值!=将返回FALSE。IIRC任何等于0的值!=将返回FALSE。=将0计算为false。使用==哪

数组
resAlloc
包含10列和5行。所有条目都等于0。所以,我希望下面的IF语句是正确的,但由于某些原因它是错误的。。。为什么?

if ($resAlloc[$i][$j] != 'ts' && $resAlloc[$i][$j] != 't' && $resAlloc[$i][$j] != 'st') {
    $count++;
}

IIRC任何等于0的值!=将返回FALSE。

IIRC任何等于0的值!=将返回FALSE。

=
0
计算为
false
。使用
==哪个更严格。

=
0
计算为
false
。使用
==哪一个更严格。

问题在于,您正在比较字符串和整数,而PHP“有帮助地”将字符串转换为整数——整数零<代码>0!='ts'
的计算结果为
false
,因为它在转换后进行的比较是
0=0
。可以通过将数组的内容显式处理为字符串来防止这种情况:

strval($resAlloc[$i][$j]) != 'ts'
这将进行比较
'0'!='ts'
,正确计算为
true
。如果向strval()传递一个字符串,它将返回不变的字符串,因此无论数组中有什么内容,都可以安全使用


或者,正如Samy Dindane所说,您可以只使用!==不会进行任何类型转换

问题在于,您正在比较字符串和整数,而PHP“有益地”将字符串转换为整数——整数零<代码>0!='ts'
的计算结果为
false
,因为它在转换后进行的比较是
0=0
。可以通过将数组的内容显式处理为字符串来防止这种情况:

strval($resAlloc[$i][$j]) != 'ts'
这将进行比较
'0'!='ts'
,正确计算为
true
。如果向strval()传递一个字符串,它将返回不变的字符串,因此无论数组中有什么内容,都可以安全使用


或者,正如Samy Dindane所说,您可以只使用!==不会进行任何类型转换

这是如何解释问题的<代码>0!='ts'
false!='ts'
的计算结果应该都是
true
,因此if语句作为一个整体应该是true。是的,但我不明白为什么仅仅基于以下事实,任何比较结果都会计算为false!=将
0
视为
false
。。。哦,这是一个操作顺序的问题,不是吗?OP可能想要三个
=和&
操作之前要评估的代码>比较,这可能不是正在发生的事情。有一个完全不同的问题,那就是
0!='任何字符串“
的计算结果也都是
false
(请参见下面我的答案)。我不认为您被否决了。我向你投了一分钟的赞成票,当我意识到我不明白你的答案时,我取消了向你投的赞成票,然后我发表了评论。如果我们中有人能纠正我的错误,我会再次投票给你;我应该补充一点,我提到的问题实际上可以通过你建议使用严格的比较来解决。它们毕竟是同一个问题。这是如何解释问题的<代码>0!='ts'
false!='ts'
的计算结果应该都是
true
,因此if语句作为一个整体应该是true。是的,但我不明白为什么仅仅基于以下事实,任何比较结果都会计算为false!=将
0
视为
false
。。。哦,这是一个操作顺序的问题,不是吗?OP可能想要三个
=和&
操作之前要评估的代码>比较,这可能不是正在发生的事情。有一个完全不同的问题,那就是
0!='任何字符串“
的计算结果也都是
false
(请参见下面我的答案)。我不认为您被否决了。我向你投了一分钟的赞成票,当我意识到我不明白你的答案时,我取消了向你投的赞成票,然后我发表了评论。如果我们中有人能纠正我的错误,我会再次投票给你;我应该补充一点,我提到的问题实际上可以通过你建议使用严格的比较来解决。他们毕竟是同一个问题,这是不对的<代码>0=1
返回
true
(谢天谢地!)。我认为这是比较字符串和整数的一个问题——字符串被转换为整数零,所以两者最终是相等的!我说的是IIRC,我不确定,那是不对的<代码>0=1返回
true
(谢天谢地!)。我认为这是比较字符串和整数的一个问题——字符串被转换为整数零,所以两者最终是相等的!我说IIRC,我不太确定。