strcoll

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

strcoll基于区域设置的字符串比较

描述

strcoll(string $string1, string $string2): int

请注意,此比较区分大小写,并且与 strcmp() 不同,此函数不是二进制安全的。

strcoll() 使用当前区域设置进行比较。如果当前区域设置为 C 或 POSIX,则此函数等效于 strcmp().

参数

string1

第一个字符串。

string2

第二个字符串。

返回值

如果 string1 小于 string2,则返回 < 0;如果 string1 大于 string2,则返回 > 0;如果它们相等,则返回 0。

参见

  • preg_match() - 执行正则表达式匹配
  • strcmp() - 二进制安全的字符串比较
  • strcasecmp() - 二进制安全的区分大小写字符串比较
  • substr() - 返回字符串的一部分
  • stristr() - 不区分大小写的 strstr
  • strncasecmp() - 二进制安全的区分大小写字符串比较,比较前 n 个字符
  • strncmp() - 二进制安全的字符串比较,比较前 n 个字符
  • strstr() - 查找字符串的第一个出现位置
  • setlocale() - 设置区域设置信息

添加注释

用户贡献的注释 3 个注释

8
匿名
21 年前
请注意,某些平台根据当前区域设置来实现 strcmp() 和 strcasecmp(),当字符串不是二进制相等时,因此 strcmp() 和 strcoll() 将返回相同的值!这取决于 PHP strcmp() 函数的编译方式(即,它是否使用其标准库中找到的特定于平台的 strcmp()!)。
在这种情况下,strcoll() 和 strcmp() 之间的唯一区别是 strcoll() 可能会对不同的字符串返回 0(即,认为字符串相等),而 strcmp() 如果它们具有不同的二进制编码,则会区分它们!这通常发生在亚洲系统上。
您可以确定的是,strcmp() 将始终区分编码不同的字符串,但相对顺序可能仍然使用当前区域设置来进行排序顺序!
6
mkroese at eljakim dot nl
5 年前
您不应该依赖此函数来正确比较本地化的字符串。

<?php
$a
= "Österreich";
$b = "Oesterreich";
$z = "Zeta";

echo
setlocale(LC_ALL, 0) . PHP_EOL; // (在我的 mac 上: C/en_US.UTF-8/C/C/C/C)
echo strcoll($a, $b) . PHP_EOL; // 116
echo strcoll($b, $a) . PHP_EOL; // -116
echo strcoll($a, $z) . PHP_EOL; // 105

echo setlocale(LC_ALL, "de_DE") . PHP_EOL; // de_DE
echo strcoll($a, $b) . PHP_EOL; // 135
echo strcoll($b, $a) . PHP_EOL; // -135
echo strcoll($a, $z) . PHP_EOL; // 124

$collator = new Collator("de_DE");
echo
$collator->compare($a, $b); // 1
echo $collator->compare($b, $a); // -1
echo $collator->compare($a, $z); // -1
?>

使用 Collator(来自 intl 模块),您将获得预期的结果,例如排序,这样字符串 "Österreich" 将排名高于 "Zeta",但低于 "Oesterreich"。

strcoll 的输出将因平台、区域设置和使用的 c 库而异,而 Collator 将在不同平台上提供更稳定的结果。
-1
sakkarinlaohawisut15 at hotmail dot com
21 年前
strcoll() 的行为有时有点令人困惑。它取决于您区域设置中的 LC_COLLATE。

<?php

$a
= 'a';
$b = 'A';

print
strcmp ($a, $b) . "\n"; // 打印 1

setlocale (LC_COLLATE, 'C');
print
"C: " . strcoll ($a, $b) . "\n"; // 打印 1

setlocale (LC_COLLATE, 'de_DE');
print
"de_DE: " . strcoll ($a, $b) . "\n"; // 打印 -2

setlocale (LC_COLLATE, 'de_CH');
print
"de_CH: " . strcoll ($a, $b) . "\n"; // 打印 -2

setlocale (LC_COLLATE, 'en_US');
print
"en_US: " . strcoll ($a, $b) . "\n"; // 打印 -2

?>

这在想要使用 strcoll 对数组进行排序时很有用

<?php

$a
= array ('a', 'A', '?', '?', 'b', 'B');

setlocale (LC_COLLATE, 'C');
usort ($a, 'strcoll');
print_r ($a);

?>

这类似于 sort($a)
数组
(
[0] => A
[1] => B
[2] => a
[3] => b
[4] => ?
[5] => ?
)

<?php

setlocale
(LC_COLLATE, 'de_DE');
usort ($a, 'strcoll');
print_r ($a)

?>

这完全不同
数组
(
[0] => a
[1] => A
[2] => ?
[3] => ?
[4] => b
[5] => B
)
To Top