比较字符串,在PHP中包含==的空格

时间:2015-08-31 11:59:07

标签: php string-comparison

我很好奇为什么在PHP中发生这种情况:

'78' == ' 78' // true
'78' == '78 ' // false

我知道使用strcmp或最少===要好得多。我还知道,当您将数字字符串与==进行比较时,如果可能,它们会被转换为数字。我也可以接受前导空格被忽略,所以(int)' 78'是78,在第一种情况下答案是正确的,但我真的很困惑为什么它在第二种情况下是错误的。

我认为'78'已投放到78'78 '投放到78,所以它们是相同的,答案是正确的,但很明显,事实并非如此。

任何帮助将不胜感激!非常感谢你提前! :)

2 个答案:

答案 0 :(得分:7)

这一切似乎都回到了this is_numeric_string_ex C function

the implementation of ==开始:

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()去除空格。