【问题标题】:How does PHP compare strings with comparison operators?PHP如何用比较运算符比较字符串?
【发布时间】:2012-10-05 00:24:05
【问题描述】:

我正在用比较运算符比较字符串。

对于以下两个比较及其结果,我需要一些简短的解释。

if('ai' > 'i')
{
    echo 'Yes';
}
else
{
    echo 'No';
}

output: No

为什么这些输出是这样的?

if('ia' > 'i')
{
    echo 'Yes';
}
else
{
    echo 'No';
}

Output: Yes

再说一遍,为什么?

也许我忘记了一些基础知识,但我确实需要对这些比较示例进行一些解释才能理解此输出。

【问题讨论】:

    标签: php string compare operators type-coercion


    【解决方案1】:

    PHP 将根据字母顺序使用大于和小于比较运算符来比较 alpha 字符串。

      1234563 '大于'。
    • 在第二个示例中,ia 位于i 字母顺序之后,因此>(大于)的测试是true - 后面的顺序被认为是“大于”。

    【讨论】:

    • 我相信你,但是 PHP.net 中是否有任何文档明确说明了这一点。所以我可以分享以供将来参考。
    • 当然。这里有官方文档:Comparison Operators 和这里:String conversion to numbers
    • 我在 Andron 的评论链接的页面上找不到任何提及字母字符串比较的内容。有人可以引用文档中实际提到的地方吗?
    • @orrd 查看第二个表格的第一行/标题为“与各种类型的比较”的表格
    • 字符串的值是基于ASCII表的。因此,小写字母的价值将高于大写字母。
    【解决方案2】:

    扩展@coderabbi 的答案:

    这与在某些应用程序中按数字排序并获得如下结果时的逻辑类型相同:

    • 0
    • 1
    • 105
    • 11
    • 2
    • 21
    • 3
    • 333
    • 34

    不是基于字符串长度,而是每个字符按字符串的顺序排列。

    【讨论】:

    • 这可能会在比较版本“数字”(通常存储为字符串)时产生问题,例如 '10-a' 被认为是
    • 实际上铸造(浮动)仍然可能是一个问题,例如在将 '1.8-a' 与后来的 '1.8' 进行比较时......
    • 对于版本比较,version_compare() 效果很好。
    【解决方案3】:

    php 中的<> 比较运算符将比较字符串的第一个字符,然后比较字符串中的其他字符。因此,您的第一个表达式 ai(第一个字符串)和 i(第二个字符串)a 是字符串中的第一个字符,而 i 作为第二个字符串中的第一个字符,> 将返回false,随后第二个语句将返回true 由于同样的原因。但是,如果您确实需要比较两个较长的字符串值与许多字符,您可以尝试使用substr_compare 方法:

    substr_compare("abcde", "bc", 1, 2);
    

    在此示例中,您有两个要比较的字符串,1 是偏移开始位置,2 表示您要比较这些字符串右侧的字符数。 -1 表示从第一个字符串的末尾开始的偏移量。例如做这样的事情:

    substr_compare("string1", "string2", 0, length);
    

    另外,也可以考虑使用 strcmp(),即strcmp("string1", "string2", length),其中长度是要从两个字符串中比较的字符数。

    【讨论】:

    • 虽然您认为 strcmp() 更可取是正确的,但 PHP 实际上会比较字符串的所有字符,而不仅仅是第一个字符,只要它们是相关的。换句话说,如果可以在第一个字符之后建立字母顺序,则比较到此结束。但是,如果第一个字符相等,则比较移动到第二个(必要时第三个、第四个等)字符。测试一下。 $result = 'aaaaaaab' > 'aaaaaaa' ?真假;将返回 true 而相反, $result = 'aaaaaaab'
    • @coderabbi,我们在说同样的事情。我点击提交答案按钮,不知道我写的一些内容已被我的蜗牛电脑操作截断。您的回复引起我对错误的注意。它已经被编辑,我希望所有者现在可以更好地理解它。感谢您引起我的注意。
    【解决方案4】:

    当两个字符串都是数字格式时,PHP会将字符串转换为数字并转换值。

    如果您将数字与字符串进行比较,或者比较涉及 数字字符串,然后将每个字符串转换为数字,然后 数值进行比较。这些规则也适用于交换机 陈述。比较时不发生类型转换 是 === 或 !== 因为这涉及比较类型以及 价值。

    参考https://www.php.net/manual/en/language.operators.comparison.php

    编辑:格式化。

    【讨论】:

      猜你喜欢
      • 2013-09-16
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      • 1970-01-01
      相关资源
      最近更新 更多