PHP如何使用比较运算符比较字符串?

16

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

我需要一些解释下面两个比较及其结果。

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

output: No

为什么它们会这样输出?

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

Output: Yes

为什么再次出现这个问题?

也许我忘记了一些基础知识,但我真的需要解释一下这些比较示例才能理解这个输出。

4个回答

24

PHP将使用大于号和小于号比较字母字符串,基于字母顺序进行比较。

  • 在第一个示例中,“ai”在字母顺序中出现在“i”之前,所以“>”(大于)的测试结果为false- 在顺序中更早被认为是“小于”而不是“大于”。

  • 在第二个示例中,“ia”在字母顺序中出现在“i”之后,所以“>”(大于)的测试结果为true- 在顺序中更晚被认为是“大于”。


我相信你,但是在PHP.net上是否有任何明确说明的文档,以便我可以分享给未来参考。 - DrJonOsterman
当然。这里有官方文档:比较运算符字符串转换为数字 - Andron
我在Andron的评论链接页面中没有找到任何有关字母字符串比较的提及。有人能引用一下文档中实际提到这个的地方吗? - orrd
1
@orrd,请查看第二个表格的第一行 / 具有“不同类型比较”标题的表格。 - hmundt
字符串的值基于ASCII表。因此,小写字母的值将比大写字母高。 - ToyRobotic

7

对于 coderabbi的回答,进一步解释:

这和某些应用程序中按数字排序并获取以下结果的逻辑相同:

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

它不是基于字符串长度,而是根据字符串中每个字符的顺序。


当比较版本“号码”(通常存储为字符串)时,这可能会导致问题,例如'10-a'被认为小于'8b',因此在这种情况下最好先转换为(float)(假设版本字符串可以转换)。 - Jorge Orpinel Pérez
实际上,强制转换(float)仍然可能存在问题,例如将“1.8-a”与后来的“1.8”进行比较... - Jorge Orpinel Pérez
对于版本比较,version_compare() 函数非常好用。 - server_kitten

1
当两个字符串都是数字格式时,PHP会将字符串转换为数字并转换值。
如果您将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都将转换为数字并进行数字比较。这些规则也适用于switch语句。当比较涉及类型和值时,类型转换不会发生在===或!==中。
参考:比较运算符

1

在 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),其中length是要从两个字符串中比较的字符数。

虽然您是正确的,strcmp()更可取,但PHP实际上会比较字符串的所有字符,而不仅仅是第一个字符,只要它们是相关的。换句话说,如果在第一个字符之后可以建立字母顺序,则比较就在那里结束。然而,如果第一个字符相等,则比较移动到第二个(第三个、第四个等等)字符。测试一下。$result = 'aaaaaab' > 'aaaaaaa' ? true : false;将返回true,而它的相反情况,$result = 'aaaaaab' < 'aaaaaaa' ? true : false;将返回false。 - coderabbi
@coderabbi,我们的意思是一样的。我按下提交答案按钮时不知道我的某些内容被我的蜗牛电脑操作切断了。你的回复引起了我的注意,这个错误已经被编辑过了,我希望所有者现在能够更好地理解它。谢谢你让我注意到这个问题。 - Morufu Salawu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接