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 則註釋

9
匿名
22 年前
請注意,某些平台在字串二進位不相等時,會根據目前的地區設定來實作 strcmp() 和 strcasecmp(),因此 strcmp() 和 strcoll() 會返回相同的值!這取決於 PHP strcmp() 函式的編譯方式(例如,它是否使用標準函式庫中平台特定的 strcmp()!)。
在這種情況下,strcoll() 和 strcmp() 的唯一區別是,strcoll() 可能會針對不同的字串返回 0(即認為字串相等),而 strcmp() 如果它們具有不同的二進位編碼,則會區分它們!這通常發生在亞洲系統上。
您可以確定的是,strcmp() 將始終區分編碼不同的字串,但相對順序可能仍會使用目前的地區設定進行排序順序!
7
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', '?'span>, '?'span>, '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