【问题标题】:PHP strcmp is not returning the correct answer with session variablePHP strcmp 未使用会话变量返回正确答案
【发布时间】:2013-09-18 18:02:18
【问题描述】:

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

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

返回:

Below Average = Below Average

当我对会话变量执行 gettype() 时,它返回类型“字符串”。

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

我还尝试了一个带有 == 的 IF 语句,而不是 strcmp 测试是否相等,以及一个 IF 语句将它们都转换为字符串并测试它们是否相等但没有运气。

这可能是什么原因?

【问题讨论】:

  • 如何设置 $_SESSION['condition'] 的值?那里可能有一个不可见的流浪换行符吗?
  • var_dump($_SESSION['condition']); 输出什么?
  • 您能告诉我们您正在使用的 IF 语句吗?
  • 查看 strcmp() 的返回值以及 Eric。如果这是您所希望的,它不会返回 TRUE。事实上,如果字符串匹配被错误地评估为假,它会返回 0。 php.net/manual/en/function.strcmp.php

标签: php session strcmp gettype


【解决方案1】:

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

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

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

看看这是否有帮助。

另外,您可以使用 var_dump($_SESSION['condition']);检查值。

【讨论】:

  • 你可能是对的,它是空格。 strcmp(' ', 'B') 返回-34
  • 没有骰子,我得到一个“不!”
  • 等等! $condition = trim($_SESSION['condition']);工作但 $string = preg_replace('/\s+/', ' ', $string);没有,谢谢!
【解决方案2】:

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

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

正如 Barmar 在 cmets 中指出的,a 和 B 之间的差异是 -34,我相信是这样的。

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

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

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

输出:

True

Demo!

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

用于替换所有空格:

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

删除开头和结尾的空格:

$string = trim($string);

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多