我很好奇为什么在PHP中发生这种情况:
'78' == ' 78' // true
'78' == '78 ' // false
我知道使用strcmp
或最少===
要好得多。我还知道,当您将数字字符串与==
进行比较时,如果可能,它们会被转换为数字。我也可以接受前导空格被忽略,所以(int)' 78'
是78,在第一种情况下答案是正确的,但我真的很困惑为什么它在第二种情况下是错误的。
我认为'78'
已投放到78
而'78 '
投放到78
,所以它们是相同的,答案是正确的,但很明显,事实并非如此。
任何帮助将不胜感激!非常感谢你提前! :)
答案 0 :(得分:7)
这一切似乎都回到了this is_numeric_string_ex
C function。
ZEND_API int ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2) {
...
switch (TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2))) {
...
case TYPE_PAIR(IS_STRING, IS_STRING):
...
ZVAL_LONG(result, zendi_smart_strcmp(op1, op2));
如果两个操作数都是字符串,则最终调用zendi_smart_strcmp
...
ZEND_API zend_long ZEND_FASTCALL zendi_smart_strcmp(zval *s1, zval *s2) {
...
if ((ret1 = is_numeric_string_ex(Z_STRVAL_P(s1), Z_STRLEN_P(s1), &lval1, &dval1, 0, &oflow1)) &&
(ret2 = is_numeric_string_ex(Z_STRVAL_P(s2), Z_STRLEN_P(s2), &lval2, &dval2, 0, &oflow2))) ...
调用is_numeric_string_ex
...
/* Skip any whitespace
* This is much faster than the isspace() function */
while (*str == ' ' || *str == '\t' || *str == '\n' || *str == '\r' || *str == '\v' || *str == '\f') {
str++;
length--;
}
ptr = str;
其中有明确的代码在开头跳过空格,但不在最后。
答案 1 :(得分:-1)
'78'末尾的空格使PHP将变量视为字符串。你可以使用trim()去除空格。