PHP Conference Japan 2024

strcoll

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

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

描述

strcoll(字符串 $string1, 字符串 $string2): 整数

注意,此比较区分大小写,并且与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条注释

匿名
22年前
请注意,某些平台根据当前区域设置实现strcmp()和strcasecmp()(当字符串不完全相等时),以便strcmp()和strcoll()将返回相同的值!这取决于PHP strcmp()函数的编译方式(即,它是否使用在其标准库中找到的特定于平台的strcmp()!)。
在这种情况下,strcoll()和strcmp()之间的唯一区别在于strcoll()可能会对不同的字符串返回0(即,认为字符串相等),而strcmp()如果它们具有不同的二进制编码,则会区分它们!这通常发生在亚洲系统上。
您可以确信的是,strcmp()将始终区分编码不同的字符串,但相对顺序仍然可能使用当前区域设置进行排序!
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将在不同的平台上提供更稳定的结果。
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