我有一个令我困惑的问题。我之前注意到了这一点,但直到今天才注意到它。
我试图编写自己的整数字符串检查。我知道is_numeric()
,但这还不够,因为它将float
计为数字integers
和is_int()
不会对字符串数字起作用。
我做了类似的事情
$var1 = 'string';
$var2 = '123';
var_dump( (int)$var1 == $var1);// boolean true
var_dump((int)$var2 == $var2);// boolean true
var_dump((int)$var1);//int 0
var_dump($var1);//string 'string' (length=6)
正如预期的那样,第二个var转储输出为true,因为我期望使用php的松散比较,字符串和整数版本相等。
然而,第一次,我不明白为什么会这样。我尝试过投射到bool
,它仍然给我相同的结果。
我尝试将cast var分配给一个新的变量并比较两者,结果仍然相同
这是我做错了还是php错误?
***注
我不是在这里比较类型。我实际上是想利用int 0
不等于string 'string'
的事实。
我用不同的方式编写了整数检查,所以我真的不需要替代方案。
***编辑
我做了一些额外的检查,结果证明0 == 'string'
也是如此。怎么可能?
***编辑2 这个问题下面有多个正确的答案。感谢所有回答的人。
答案 0 :(得分:7)
这不是错误,它是功能。任何字符串都可以转换为整数,但是the cast will return 0 if the string doesn't start with an integer value.此外,在比较整数和字符串时,the string is casted to an integer and then the check is done against the two integers。由于该规则,任何随机字符串都“等于”为零。 (要绕过此行为,您应该使用strcmp
,因为它通过转换传递给字符串的任何内容来执行显式字符串比较。)
为了确保我正在处理整数,我首先使用is_numeric
,然后将字符串转换为int
,并验证stringified int是否对应于输入值。
if (is_numeric($value) && strcmp((int)$value, $value) == 0)
{
// $value is an integer value represented as a string
}
答案 1 :(得分:2)
根据php.net http://php.net/manual/en/language.operators.comparison.php:
var_dump(0 == "a"); // 0 == 0 -> true
所以,我认为它是杂乱的类型,并实际上将双方都转换为int。然后比较字符串中ascii值的总和或每个相应索引的ascii值。
答案 2 :(得分:2)
首先在数学'='中称为传递b / c(A = B且B = C => A = C)是有效的。
PHP不是“==”!
(int)$var1 == $var1
在这种情况下,PHP会将'string'强制转换为0 - 这是一种惯例。
然后== - 运算符将隐含地将第二个操作数'string'也转换为整数 - >以及0。
这导致了真实。
答案 3 :(得分:2)
您的帖子出错,正确的输出是:
bool(true)
bool(true)
int(0)
string(6) "string"
这是怎么回事:
==
的整数进行比较,PHP将首先隐含地将字符串转换为整数,更明确但100%等效的形式将是:if((int)$var1 == (int) $var1)
int(0)
,因为它无法解析数字,而是会返回0
。string(6) "string"
- 按预期答案 4 :(得分:1)
如果您想比较变量类型,您应该使用===
。
答案 5 :(得分:1)
注意:此答案是对a related question about the Twig template engine的回复,已标记为重复,并在此重定向。
由于背景不同,此答案将提供给SO社区的成员,他们可能会受益于与twig专门相关的其他详细信息。
TL; DR :请参阅此帖子How do the PHP equality (== double equals) and identity (=== triple equals) comparison operators differ?
==
)会在Twig中产生意外结果?为什么以下产生不同的结果?
{{ dump(0 == 'somekey') }} ==> true {{ dump(0|lower == 'somekey') }} ==> false
===
产生意外结果的可能性要小得多。< / LI>
===
与标准PHP相同===
using same as
答案 6 :(得分:0)
这是一个更严格地测试int或整数字符串的函数。
function isIntegerNumeric($val) {
return (
is_int($val)
|| (
!is_float($val)
&& is_numeric($val)
&& strpos($val, ".") === false
)
);
}
它相对较快,并且如果没有必要,可以避免进行任何字符串检查。