PHP strcmp没有返回会话变量的正确答案

时间:2013-09-13 23:22:17

标签: php session strcmp gettype

我有一个会话变量$ _SESSION ['condition'],我知道它已设置,因为当我输入这个:

echo $_SESSION['condition']." = "."Below Average";

它返回:

Below Average = Below Average

当我在会话变量上执行gettype()时,它返回类型“string”。

然而,当我执行strcmp()时,它返回:-34

我还尝试了一个IF语句,使用==而不是strcmp测试相等性和一个IF语句将它们作为字符串转换并测试它们是否相等而没有运气。

这可能是什么原因?

2 个答案:

答案 0 :(得分:2)

可能有一个空格或不可见的字符导致strcmp()出现此问题。您可以使用trim()来帮助清理字符串,然后使用文字方程运算符,===来测试真正的相等性。见下文

$condition = trim($_SESSION['condition']);

if ($condition === 'Below Average') {
    echo 'True';
} else {
    echo 'Nope!';
}

看看这是否有帮助。

另外,你可以使用var_dump($ _ SESSION ['condition']);检查价值。

答案 1 :(得分:0)

strcmp()函数(通常)返回字符串之间第一个不同字符的差异。

因此,如果你的字符串之间存在差异,strcmp()会停在那里并返回两个字符的ASCII值之间的差异。

正如Barmar在评论中指出的那样,空格与B之间的区别是-34,我相信情况就是如此。

这可以通过以下方式确认:

$v1 = ord(' ') - ord('B');
$v2 = strcmp('B', ' ');

if($v1 == $v2) {
    echo 'True';
}

输出:

True

Demo!

为确保不会发生这种情况,您可以使用trim()作为Rottingham建议,也可以使用正则表达式删除所有不需要的字符。

替换所有空格:

$string = preg_replace('/\s+/', ' ', $string); 

从开头和结尾删除空格:

$string = trim($string);

希望这有帮助!