小编给大家分享一下PHP中国际化字符串排序和比较对象的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
正常来说,如果我们对数组中的字符进行排序,按照的是字符的 ASC2 表的顺序进行排列,如果是英文还好,但对于中文的话,排序出来的结果会是非常懵逼的。
$arr = ['我','是','硬','核','项', '目', '经', '理']; sort($arr); var_dump( $arr ); // array(8) { // [0]=> // string(3) "我" // [1]=> // string(3) "是" // [2]=> // string(3) "核" // [3]=> // string(3) "理" // [4]=> // string(3) "目" // [5]=> // string(3) "硬" // [6]=> // string(3) "经" // [7]=> // string(3) "项" // }
按照我们的习惯会以中文的拼音来对汉字进行排序,这个时候往往大家都会选择自己写排序的算法或者去找合适的 Composer 包。其实,PHP 中已经为我们准备了一个对象就是用来处理这类问题的。
$coll = new Collator( 'zh_CN' ); $coll->sort($arr); var_dump( $arr ); // array(8) { // [0]=> // string(3) "核" // [1]=> // string(3) "经" // [2]=> // string(3) "理" // [3]=> // string(3) "目" // [4]=> // string(3) "是" // [5]=> // string(3) "我" // [6]=> // string(3) "项" // [7]=> // string(3) "硬" // }
没错,正是这个 Collator 类。它在实例化的时候需要指定当前的区域,比如我们指定为 zh_CN ,也就是中文字符区域,这时候再使用它的 sort() 方法就可以完成对中文字符的拼音排序。
$coll->sort($arr, Collator::SORT_NUMERIC ); var_dump( $arr ); // array(8) { // [0]=> // string(3) "核" // [1]=> // string(3) "经" // [2]=> // string(3) "理" // [3]=> // string(3) "目" // [4]=> // string(3) "是" // [5]=> // string(3) "我" // [6]=> // string(3) "项" // [7]=> // string(3) "硬" // } $coll->sort($arr, Collator::SORT_STRING ); var_dump( $arr ); // array(8) { // [0]=> // string(3) "核" // [1]=> // string(3) "经" // [2]=> // string(3) "理" // [3]=> // string(3) "目" // [4]=> // string(3) "是" // [5]=> // string(3) "我" // [6]=> // string(3) "项" // [7]=> // string(3) "硬" // }
Collator 对象的 sort() 方法还支持第二个参数,用于指定当前的排序是按照字符还是数字格式进行排序。对于纯中文的内容来说,这个没有什么区别。
除了 sort() 方法之外,它还有一个 asort() 方法,就和普通的 asort() 函数一样的功能,只不过它也是支持不同的区域语言的。
$arr = [ 'a' => '100', 'b' => '7', 'c' => '50' ]; $coll->asort($arr, Collator::SORT_NUMERIC ); var_dump( $arr ); // array(3) { // ["b"]=> // string(1) "7" // ["c"]=> // string(2) "50" // ["a"]=> // string(3) "100" // } $coll->asort($arr, Collator::SORT_STRING ); var_dump( $arr ); // array(3) { // ["a"]=> // string(3) "100" // ["c"]=> // string(2) "50" // ["b"]=> // string(1) "7" // } $arr = [ '中' => '100', '的' => '7', '文' => '50' ]; $coll->asort($arr, Collator::SORT_NUMERIC ); var_dump( $arr ); // array ( // '的' => '7', // '文' => '50', // '中' => '100', // ) $coll->asort($arr, Collator::SORT_STRING ); var_dump( $arr ); // array ( // '中' => '100', // '文' => '50', // '的' => '7', // )
asrot() 方法是根据键和值一起进行排序的,所以在这里指定 SORT_STRING 和 SORT_NUMERIC 就有明显的效果了。我们可以看出,如果是根据数字排序,那么结果就是以数字内容为准的,如果是根据字符排序,那么结果就是以键值中的字符串部分为基础进行排序的。
不管是 sort() 还是 asrot() 本质上都和普通的 PHP 默认提供的 sort() 和 asrot() 函数一样的。只是它们多了区域语言的功能而已。
另外,Collator 对象中还提供了一个 sortWithSortKeys() 方法,这个是普通的 PHP 排序函数中没有的。
$arr = ['我','是','硬','核','项', '目', '经', '理']; $coll->sortWithSortKeys($arr); var_dump( $arr ); // array ( // 0 => '核', // 1 => '经', // 2 => '理', // 3 => '目', // 4 => '是', // 5 => '我', // 6 => '项', // 7 => '硬', // )
它与 sort() 方法是类似的,但使用的是 ucol_getSortKey() 来生成的 ICU 排序键,在大型数组上的速度更快。
ICU 的全称是 International Components for Unicode ,也就是 Unicode 的国际化组件,它提供了翻译相关的功能,也就是我们系统中以及各类编程语言要实现国际化能力的基础。
接下来就是字符串的比较,比如说我们都知道,"a" 是比 "A" 要大的,因为在 ASC2 码表中,"A" 是 65 ,"a" 是 97 。当然,这只是默认情况下的比较,在使用 Collator 对象的函数进行比较时,则是根据字典库中的排序索引进行比较的,对于中文来说,基本上就也是按照拼音的顺序来比较了。
var_dump($coll->compare('Hello', 'hello')); // int(1) var_dump($coll->compare('你好', '您好')); // int(-1)
compare() 方法就是用来进行比较的,如果两个字符串相等,返回的就是 0 ,如果第一个字符串大于第二个,返回的是 1 ,否则返回的是 -1 。从代码中,我们可以看出 "Hello" 是大于 "hello" 的,"你好" 是小于 "您好" 的( 因为 "您" 多了一个 g )。
Collator 对象中还可以设置一些对象的属性。
$coll->setAttribute(Collator::CASE_FIRST, Collator::UPPER_FIRST); var_dump($coll->getAttribute(Collator::CASE_FIRST)); // int(25) var_dump($coll->compare('Hello', 'hello')); // int(-1) $coll->setAttribute(Collator::CASE_FIRST, Collator::LOWER_FIRST); var_dump($coll->getAttribute(Collator::CASE_FIRST)); // int(24) var_dump($coll->compare('Hello', 'hello')); // int(1) $coll->setAttribute(Collator::CASE_FIRST, Collator::OFF); var_dump($coll->getAttribute(Collator::CASE_FIRST)); // int(16) var_dump($coll->compare('Hello', 'hello')); // int(1)
这里我们是为对象指定 CASE_FIRST 属性,属性值可以指定 大写优先、小写优先 之类的,对于英文字符来说,这个可以影响排序以及对比的结果。
另外,我们还可以通过一个方法获得当前区域语言的信息。
var_dump($coll->getLocale(Locale::VALID_LOCALE)); // string(10) "zh_Hans_CN" var_dump($coll->getLocale(Locale::ACTUAL_LOCALE)); // string(2) "zh"
这两个参数分别是获得有效的区域设置信息和实际的区域信息。
当然,我们也可以看到具体的排序信息,也就是字符在 Collator 中的编码。
var_dump(bin2hex($coll->getSortKey('Hello'))); // string(20) "b6b0bebec4010901dc08" var_dump(bin2hex($coll->getSortKey('hello'))); // string(18) "b6b0bebec401090109" var_dump(bin2hex($coll->getSortKey('你好'))); // string(16) "7b9b657301060106" var_dump(bin2hex($coll->getSortKey('您好'))); // string(16) "7c33657301060106" $coll = collator_create( 'en_US' ); var_dump($coll->compare('Hello', 'hello')); // int(1) var_dump($coll->compare('你好', '您好')); // int(-1) var_dump($coll->getLocale(Locale::VALID_LOCALE)); // string(5) "en_US" var_dump($coll->getLocale(Locale::ACTUAL_LOCALE)); // string(4) "root" var_dump(bin2hex($coll->getSortKey('Hello'))); // string(20) "3832404046010901dc08" var_dump(bin2hex($coll->getSortKey('hello'))); // string(18) "383240404601090109" var_dump(bin2hex($coll->getSortKey('你好'))); // string(20) "fb0b8efb649401060106" var_dump(bin2hex($coll->getSortKey('您好'))); // string(20) "fba5f8fb649401060106"
可以看出,不用同的区域语言获取到的 getSortKey() 排序键信息是不同的,不过它们都是以 16进制 存储的,这和默认的 ASC2 码完全不同了。
$coll = new Collator( 'en_US' );; $coll->compare( 'y', 'k' ); var_dump($coll->getErrorCode()); // int(0) var_dump($coll->getErrorMessage()); // string(12) "U_ZERO_ERROR"
使用 getErrorCode() 可以获得错误码,使用 getErrorMessage() 可以获得错误信息。关于返回的这个 U_ZERO_ERROR 并没有查找到相关的资料,希望懂行的朋友可以回复说明,大家一起学习。
另外就是 Collator 对象就还有一个排序强度的设定,不过我测试的效果并没有体现出来。
$arr = array( 'a', 'à' ,'A'); $coll = new Collator( 'de_DE' ); $coll->sort($arr); var_dump($coll->getStrength()); var_dump( $arr ); // int(2) // array(3) { // [0]=> // string(1) "a" // [1]=> // string(1) "A" // [2]=> // string(2) "à" // } $coll->setStrength(Collator::IDENTICAL); var_dump($coll->getStrength()); // int(15) $coll->sort($arr); var_dump( $arr ); $coll->setStrength(Collator::QUATERNARY); var_dump($coll->getStrength()); // int(3) $coll->sort($arr); var_dump( $arr ); $coll->setStrength(Collator::PRIMARY); var_dump($coll->getStrength()); // int(0) $coll->sort($arr ); var_dump( $arr ); $coll->setStrength(Collator::TERTIARY); var_dump($coll->getStrength()); // int(2) $coll->sort($arr ); var_dump( $arr ); $coll->setStrength(Collator::SECONDARY); var_dump($coll->getStrength()); // int(1) $coll->sort($arr ); var_dump( $arr );
以上是“PHP中国际化字符串排序和比较对象的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。